540 有序陣列中的單一元素

2022-09-21 05:45:07 字數 1178 閱讀 8232

假設只出現一次的元素位於下標 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 因為方案應...