查找的題目基本是二分查找,排序一般是快排或歸并
快排套路是left = 0, right = x.size() - 1; while(low <= high); high = mid - 1; low = mid + 1;
該套路的結果是
1. target存在在數(shù)組中,返回該target所在位置
2. target不在數(shù)組中,low = high + 1,target應該在low和high所在元素的中間
基本的二分查找題目,是個拍好序的矩陣。需要注意的地方是low、high的取值,while循環(huán)條件,low、high更新
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(), n = m ? matrix[0].size() : 0;
if (!m || !n) return false;
int high = m*n - 1, low = 0;
while (low <= high) {
int mid = (low + high) / 2;
if (matrix[mid/n][mid%n] > target) high = mid - 1;
else if(matrix[mid/n][mid%n] < target) low = mid + 1;
else return true;
}
return false;
}
查找數(shù)值數(shù)組中目標數(shù)值應該插入的位置
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int searchInsert(vector<int>& nums, int target) {
int low = 0, high = nums.size() - 1;
while (low <= high) {
int mid = (low + high)/2;
if (nums[mid] > target) high = mid - 1;
else if(nums[mid] < target) {
low = mid + 1;
} else {
return mid;
}
}
return low;
}
}
在某個位置進行了旋轉,依然可以使用二分查找,但是比較難想。
1. mid在旋轉點的左邊
- 此時考慮target在low和mid之間的情況, high = mid - 1。其他情況low = mid + 1。
2. mid在旋轉點的右邊
- 此時考慮target在mid和high之間的情況,low = mid + 1。其他情況high = mid - 1;
循環(huán)條件為low < high。因為等于的情況會觸發(fā)判別條件中的一種。
返回值為nums[low]
int search(vector<int>& nums, int target) {
int m = nums.size();
if (!m) return -1;
int low = 0, high = m - 1;
while (low < high) {
int mid = (low + high)/2;
if (nums[mid] == target) return mid;
if (nums[low] <= nums[mid]) {
if (target >= nums[low] && target < nums[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
} else {
if (target > nums[mid] && target <= nums[high]) {
low = mid + 1;
} else {
high = mid - 1;
}
}
}
return nums[low] == target ? low : -1;
}
與上題類似,額外去除了nums[low] == nums[mid] == nums[high]的情況
bool search(vector<int>& nums, int target) {
if (nums.empty()) return false;
int low = 0, high = nums.size() - 1;
while (low < high) {
int mid = (low + high) / 2;
if (target == nums[mid]) return true;
if ((nums[low] == nums[mid]) && (nums[high] == nums[mid])) {
low++;
high--;
}
else if (nums[low] <= nums[mid]) {
if (target >= nums[low] && target < nums[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
} else {
if (target > nums[mid] && target <= nums[high]) {
low = mid + 1;
} else {
high = mid - 1;
}
}
}
return nums[low] == target ? true : false;
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。