縉云做網(wǎng)站廈門seo代理商
1. 有序數(shù)組中的單一元素(540)
題目描述:
算法原理:
二分查找解題關(guān)鍵就在于去找到數(shù)組的二段性,這里數(shù)組的二段性是從單個(gè)數(shù)字a開始出現(xiàn)然后分隔出來的,如果mid落入左半部分那么當(dāng)mid為偶數(shù)時(shí)nums[mid+1]等于nums[mid],當(dāng)mid為奇數(shù)時(shí)nums[mid]等于nums[mid-1],mid落入右半部分則相反。
細(xì)節(jié):
循環(huán)內(nèi)的判斷條件首先需要判斷mid是偶數(shù)還是奇數(shù),接著還要判斷相等的關(guān)系,是比較麻煩的。我們發(fā)現(xiàn)規(guī)律當(dāng)mid為偶數(shù)異或1時(shí)就會(huì)得到mid+1,當(dāng)mid為奇數(shù)異或1時(shí)就會(huì)得到mid-1,因此我們的判斷條件直接簡(jiǎn)化為nums[mid]是否等于nums[mid^1]。
代碼如下:
class Solution {public int singleNonDuplicate(int[] nums) {int left = 0, right = nums.length - 1;while (right > left) {int mid = left + (right - left) / 2;if (nums[mid] == nums[mid ^ 1]) {left = mid + 1;} else {right = mid;}}return nums[right];}
}
題目鏈接
2. 尋找旋轉(zhuǎn)排序數(shù)組中的最小值 II(154)
題目描述:
算法原理:
nums數(shù)組的二段性體現(xiàn)在nums[right],前半部分旋轉(zhuǎn)過去的值是大于等于nums[right]的,后半部分的值都是小于等于nums[right]。不過這題需要注意的地方就是因?yàn)閿?shù)值是可以重復(fù)的,所以當(dāng)nums[mid]等于nums[right]的時(shí)候我們是不知道m(xù)id是落在前半部分還是后半部分的,為了解決這種情況我們直接將right向左移動(dòng)一位即可,移動(dòng)之后因?yàn)槲覀兦蟮氖亲钚≈?#xff0c;所以不會(huì)影響結(jié)果,并且達(dá)到了一種去重的效果。
代碼如下:
class Solution {public int findMin(int[] nums) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > nums[right]) {left = mid + 1;} else if (nums[mid] < nums[right]) {right = mid;} else {right -= 1;}}return nums[right];}
}
題目鏈接
3. 搜索二維矩陣(74)
題目描述:
算法原理:
這一題可以使用樸素二分查找的思想來解決,將多維數(shù)組看作一維的數(shù)組,此時(shí)鋪開來left=0、right=m*n-1,得到的mid位置的值在二維數(shù)組中可以表示為matrix[mid/n]matrix[mid%n],這里的m就是數(shù)組的維度數(shù),n就是每個(gè)維度的元素個(gè)數(shù)。
代碼如下:
class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length;int n = matrix[0].length;int left = 0, right = m * n - 1;while (left <= right) {int mid = left + (right - left) / 2;if (matrix[mid / n][mid % n] > target) {right = mid - 1;} else if (matrix[mid / n][mid % n] < target) {left = mid + 1;} else {return true;}}return false;}
}
題目鏈接