給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。
示例 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)空間複雜度中執行。
這道題非常有意思。限制了時間複雜度,所以不能用遍歷或者異或的方法(異或陣列中所有元素,剩下的那個就是只出現一次的,因為其他的都被抵消了–劍指offer原題)。
o(log n)的話就想象二分吧。主要是二分的條件不好找,隱藏較深。
通過分析我們發現,我們要尋找的target元素出現的下標總是偶數。比如例項1和2中的下標分別是2和4。而如果我們找到mid後,只關注偶數下標的mid即可,因為target不可能是奇數下標。
然後,如果mid下標是偶數,而又與mid+1處的元素相等,說明l到mid+1這個區間中,元素沒有被target打亂!也就是說target沒有出現在這個區間中,應該去【mid+2,h】中找。
反之,如果不相等,那說明l到mid+1這個區間中,元素被target打亂了,應該去【l,mid】中找。
直到退出迴圈,那麼l與h相差1,則找到了nums【mid】!=nums【mid+1】,此時的nums【l】就是nums【mid】。
class
solution
if(nums[mid]
==nums[mid+1]
)else
}//當l與h差1的時候退出迴圈,則此時nums[mid]!=nums[mid+1],l就是mid,返回即可.
return nums[l];}
}
Leetcode540 查詢有序陣列中的單一元素
給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。示例 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 的演算法,這簡直就是二分的代名詞。二分的本質是需要去找乙個性質,一半滿足另一半不滿足。這個性質就是,相等的兩個元素中的第乙個的下表一定是偶數。當你搜尋到某個下標時,如果它是偶數,那就看它 它的下乙個元素 如果它是奇數,那就它 它的前乙個元素。又根據異或的性質,偶...