給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。
示例 1:
輸入: [1,1,2,3,3,4,4,8,8]
輸出: 2
示例 2:
輸入: [3,3,7,7,10,11,11]
輸出: 10
注意: 您的方案應該在 o(log n)時間複雜度和 o(1)空間複雜度中執行。
解題思路
二分查詢加遞迴演算法
如果陣列長度為1,則返回唯一的元素,該元素也正是需要查詢的元素
如果中間元素與兩邊元素都不等,則該元素也是被查詢的元素
判斷兩邊剩餘元素個數的奇偶性,奇偶性不同,且中間元素與兩邊元素的相同性決定下一次遞迴的區間
int singlenonduplicate(int* nums, int numssize)
int mid;
int is_odd;
if (numssize == 1)
return nums[0];
mid = numssize/2;
printf("mid = %d\n",mid);
if (nums[mid] != nums[mid-1] && nums[mid] != nums[mid+1])
return nums[mid];
is_odd = (numssize-mid-1) & 0x1;
printf("is_odd = %d,numssize =%d\n",is_odd,numssize);
if (is_odd) else else else {
return singlenonduplicate(&nums[0], numssize-(mid+2));
LeetCode 540 有序陣列中的單一元素
給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。示例 1 輸入 1,1,2,3,3,4,4,8,8 輸出 2 示例 2 輸入 3,3,7,7,10,11,11 輸出 10 注意 您的方案應該在 o log n 時間複雜度和 o 1 空間複雜度中執行。這道題非常...
leetCode 540 有序陣列中的單一元素
給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。示例 1 輸入 1,1,2,3,3,4,4,8,8 輸出 2 示例 2 輸入 3,3,7,7,10,11,11 輸出 10 注意 您的方案應該在 o log n 時間複雜度和 o 1 空間複雜度中執行。由於只有乙...
leetcode540 有序陣列中的單一元素
題目中很明確的說了,需要o logn 的演算法,這簡直就是二分的代名詞。二分的本質是需要去找乙個性質,一半滿足另一半不滿足。這個性質就是,相等的兩個元素中的第乙個的下表一定是偶數。當你搜尋到某個下標時,如果它是偶數,那就看它 它的下乙個元素 如果它是奇數,那就它 它的前乙個元素。又根據異或的性質,偶...