คุณสามารถใช้ XOR ของlและrเพื่อค้นหาคำตอบ
สมมติว่า l = 4 และ r = 6
l = 100, r = 110 (เทียบเท่าไบนารีของตัวเลขเหล่านี้)
l⊕r = 0 10
หมายความว่าอะไรค่าสูงสุดที่คุณต้องการจะมีบิตแรก (MSB) เป็นศูนย์ (ลองคิดดูสิมันเป็นไปได้ไหมที่ค่าสูงสุดของคุณจะมี1ในบิตแรกแทนถ้าเป็น 01010 และ 00101, xor จะเป็น = 01 111 คือค่าสูงสุดระหว่าง 01010 และ 00101 จะมีแน่นอน1ในบิตที่สองจากซ้ายมันเป็นไปไม่ได้ที่จะได้รับ1ก่อนบิตที่สองจากซ้ายคือในบิตแรกจากซ้าย)
ดังนั้นคุณเหลือ 2 บิตที่เหลือเพื่อค้นหาค่าสูงสุด เรารู้ว่าค่าที่เป็นไปได้สูงสุดเมื่อเรามีnบิตกับเราคือ = 2 n −1 ดังนั้นคำตอบในกรณีนี้จะเป็น 2 2 -1 = 4-1 = 3
จากตัวอย่างข้างต้นเราสามารถสร้างอัลกอริทึมทั่วไปสำหรับสิ่งนี้
ขั้นตอนที่ 1 num = จำนวนบิตที่ต้องใช้เพื่อแทนค่า max ( l , r )
ขั้นตอนที่ 2 res = l ⊕ r
ขั้นตอนที่ 3 pos = ตำแหน่งของบิตแรกที่ตั้งจากทางซ้ายเป็นres (การจัดทำดัชนีแบบ 0)
ขั้นตอนที่ 4 n = num - pos
ขั้นตอนที่ 5. ans = 2 n −1
ความซับซ้อนของเวลา = O (n)
j
วิ่งผ่านi+1..r
และi
วิ่งl...r-1
ให้แม่นยำ