LeetCode-Single Element in a Sorted Array
阿新 • • 發佈:2018-11-11
一、Description
題目描述:在一個有序陣列中找出只出現一次的數字,要求時間複雜度為O(log n) 。
Example 1:
Input: [1,1,2,3,3,4,4,8,8] Output: 2
Example 2:
Input: [3,3,7,7,10,11,11] Output: 10
二、Analyzation
方法一:
如果沒有時間複雜度的要求,可以考慮用異或的思路,所有出現兩次的數字通過異或相互抵消,剩下的數字就是隻出現一次的。
見code1。
方法二:
二分法:令index為Single Element在陣列中的位置。l = 0,h = nums.length - 1,m = l + (h - l) / 2。通過觀察我們可以發現,如果m為偶數,並且nums[m] == nums[m + 1],那麼index所在的位置為[m + 2, h],此時令 l = m + 2;如果 nums[m] != nums[m + 1],那麼 index 所在的陣列位置為 [l, m],此時令 h = m。
因為 h 的賦值表示式為 h = m,那麼迴圈條件也就只能使用 l < h 這種形式。
見code2。
三、Accepted code
code1:
class Solution { public int singleNonDuplicate(int[] nums) { if (null == nums || 0 == nums.length) { return -1; } int result = 0; for (int i = 0; i < nums.length; i++) { result ^= nums[i]; } return result; } }
code2:
class Solution { public int singleNonDuplicate(int[] nums) { if (null == nums || 0 == nums.length) { return -1; } int l = 0, h = nums.length - 1; while (l < h) { int m = l + (h - l) / 2; if (m % 2 == 1) { m--; } if (nums[m] == nums[m + 1]) { l = m + 2; } else { h = m; } } return nums[l]; } }