704. 二分查找
题目大意: 给定一个升序数组,以及一个target。查找target是否在数组中,若在,返回对应下标值。否则返回-1。
思路:
应该是最经典的二分查找题目了,写代码的时候主要需要注意的问题就是一些边界条件,比如说 while(low <= high) 还是 while (low < high), 这里主要取决去,每次进行查找的区间是开区间,开始闭区间。例如,*while(low <= high)*就是对应的闭区间。
个人观点:选择自己熟悉的,每次做类似的题都用同样的边界条件。
题解:
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0;
int high = nums.size()-1;
while(low <= high)
{
int middle = (low + high) / 2;
if(nums[middle] < target)
low = middle + 1;
if(nums[middle] > target)
high = middle -1;
if(nums[middle] == target)
return middle;
}
return -1;
}
};
35. 搜索插入位置
跟704很像,只不过多了一步,如果找不到的话,返回它将会被按顺序插入的位置。
思路:
相较于704不同的地方就在于,如果找不到不是返回-1,而是返回它将会被按顺序插入的位置。
题解:
class Solution {
public:
int searchInsert(vector<int>& nums, int target)
{
if(nums.size() == 0)
return 0;
int low = 0;
int high = nums.size()-1;
int middle;
while(low <= high)
{
middle = (low + high) / 2;
if(nums[middle] < target)
{
low = middle + 1;
}
if(nums[middle] > target)
{
high = middle - 1;
}
if(nums[middle] == target)
{
return middle;
}
}
/*
if(nums[middle] < target)
return middle + 1;
else
return middle;
*/
// 因为上述(类比比较那段),所以直接返回 low
return low;
}
};
待刷:
34、69、367