สมมติว่าเรามีอาร์เรย์ที่เรียกว่า nums ที่มีเงื่อนไขลำดับเลขคณิต n-1 องค์ประกอบหนึ่งยกเว้นองค์ประกอบแรกหรือสุดท้ายของ nums ถูกลบออกก่อน เราต้องหาเบอร์ที่ลบออก
ดังนั้น หากอินพุตเป็น nums =[5, 7, 11, 13] ผลลัพธ์จะเป็น 9 เพราะรายการเป็นไปตามสูตร 2i+5 ดังนั้นสำหรับ i =2 จะเป็น 2*2 + 5 =9 ที่หายไป
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้าขนาดของ nums เท่ากับ 2 แล้ว
-
return floor ของ (ผลรวมขององค์ประกอบทั้งหมดที่มีอยู่ใน nums)/2
-
-
ถ้า nums[0] เหมือนกับ nums[1] แล้ว/p>
-
ส่งคืนหมายเลข[0]
-
-
ต่ำกว่า :=nums[0]
-
upper :=องค์ประกอบสุดท้ายของ nums
-
ช่วงเวลา :=ชั้นของ (บน - ล่าง) / ขนาดของ nums
-
ตัวชี้ :=ชั้นของขนาด nums / 2
-
ซ้าย :=0
-
ขวา :=ขนาดของตัวเลข - 1
-
ในขณะที่ซ้ายไม่เหมือนขวาให้ทำ
-
ถ้า nums[ตัวชี้] ไม่เหมือนกับ nums[0] + ตัวชี้ช่วงเวลา * แล้ว
-
ถ้า nums[pointer - 1] เหมือนกับ nums[0] + interval *(pointer - 1) แล้ว
-
คืนค่า nums[0] + ช่วงเวลา * ตัวชี้
-
-
มิฉะนั้น
-
ขวา :=ตัวชี้
-
ตัวชี้ :=ชั้นของ (ซ้าย + ขวา) / 2
-
-
-
มิฉะนั้น
-
ถ้าขวา - ซ้ายเท่ากับ 1 แล้ว
-
ตัวชี้ :=ขวา
-
-
มิฉะนั้น
-
ซ้าย :=ตัวชี้
-
ตัวชี้ :=ชั้นของ (ซ้าย + ขวา) / 2
-
-
-
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น
def solve(nums): if len(nums) == 2: return sum(nums) // 2 if nums[0] == nums[1]: return nums[0] lower = nums[0] upper = nums[-1] interval = (upper - lower) // len(nums) pointer = len(nums) // 2 left = 0 right = len(nums) - 1 while left != right: if nums[pointer] != nums[0] + interval * pointer: if nums[pointer - 1] == nums[0] + interval * (pointer -1): return nums[0] + interval * pointer else: right = pointer pointer = (left + right) // 2 else: if right - left == 1: pointer = right else: left = pointer pointer = (left + right) // 2 nums = [5, 7, 11, 13] print(solve(nums))
อินพุต
[5, 7, 11, 13]
ผลลัพธ์
9