假設只出現一次的元素位於下標 x,由於其餘每個元素都出現兩次,因此下標 xx 的左邊和右邊都有偶數個元素,陣列的長度是奇數。
由於陣列是有序的,因此陣列中相同的元素一定相鄰。對於下標 x左邊的下標 y,如果 nums[y] = nums[y + 1]nums[y]=nums[y+1],則 y一定是偶數;對於下標 x 右邊的下標 z,如果 nums[z] = nums[z + 1]nums[z]=nums[z+1],則 zz 一定是奇數。由於下標 xx 是相同元素的開始下標的奇偶性的分界,因此可以使用二分查詢的方法尋找下標 x。
初始時,二分查詢的左邊界是 0,右邊界是陣列的最大下標。每次取左右邊界的平均值mid 作為待判斷的下標,根據 mid 的奇偶性決定和左邊或右邊的相鄰元素比較:
如果 mid 是偶數,則比較 nums[mid] 和 nums[mid + 1]是否相等;
如果 mid 是奇數,則比較 nums[mid- 1] 和 nums[mid]是否相等。
如果上述比較相鄰元素的結果是相等,則 mid < x,調整左邊界,否則 mid ≥x,調整右邊界。調整邊界之後繼續二分查詢,直到確定下標 x 的值。
得到下標 xx 的值之後,nums[x] 即為只出現一次的元素。
細節利用按位異或的性質,可以得到 mid 和相鄰的數之間的如下關係,其中 ⊕ 是按位異或運算子:
當 mid 是偶數時,mid + 1 = mid⊕1;
當 mid 是奇數時,mid−1=mid⊕1。
因此在二分查詢的過程中,不需要判斷 mid 的奇偶性,mid 和 mid⊕1 即為每次需要比較元素的兩個下標。
/**
* @param nums
* @return
*/var singlenonduplicate = function(nums) else
} return nums[left]
};
因為陣列是有序的,只要判斷相鄰兩個元素是否相等,如果不相等,則說明這個元素是單一的。
/**
* @param nums
* @return
*/var singlenonduplicate = function(nums) {
const length = nums.length;
for(let i =0;i
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 空間複雜度中執行。解題思路 1....
540 有序陣列中的單一元素
給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。示例 1 示例 2 注意 您的方案應該在 o log n 時間複雜度和 o 1 空間複雜度中執行。1.令 index 為 single element 在陣列中的位置。在 index 之後,陣列中原來存在的成對狀...
540 有序陣列中的單一元素
給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。注意 您的方案應該在 o log n 時間複雜度和 o 1 空間複雜度中執行。示例 1 輸入 1,1,2,3,3,4,4,8,8 輸出 2 示例 2 輸入 3,3,7,7,10,11,11 輸出 10 因為方案應...