题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n)
的算法。
因为才看完二分法的缘故,一看到这道题就选择了是用二分法来解决这道题。但是呢,我的代码虽然跑通了,但是写得是一言难尽,菜鸟献丑了。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l = 0;
int r = nums.size() - 1;
while(l <= r){
int m = l + (r - l)/2;
if(nums[r] < target){
return r + 1;
}
else if(nums[l] > target){
return l;
}
else if(nums[m] > target){
r = m - 1;
}
else if(nums[m] < target){
l = m + 1;
}
else if(nums[m] == target){
return m;
}
else{
return m + 1;
}
}
return 0;
}
};
请注意!!!思维要跳脱出来,不要因为才看了二分法就只知道用二分法来做,每道题肯定都有不同的做法,一定要把自己能想到的方法都先在脑海里面预想一遍!!不然就只有像我这样写的一言难尽。
下面是一些我做完题之后去学习的其他的一些解法:
①暴力解法
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
if (nums[i] >= target) {
return i;
}
}
return nums.size();
}
};
②比我写得好的二分法
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size();
int left = 0;
int right = n - 1;
while (left <= right) {
int middle = left + ((right - left) / 2);
if (nums[middle] > target) {
right = middle - 1;
} else if (nums[middle] < target) {
left = middle + 1;
} else { // nums[middle] == target
return middle;
}
}
return right + 1;
}
};
③运用STL的binary_search查找算法(我觉得有点东西的哈哈哈)
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
// 调用 std::binary_search 函数查找目标值
bool found = std::binary_search(nums.begin(), nums.end(), target);
// 如果找到目标值,则返回其索引
if (found) {
return std::distance(nums.begin(), std::lower_bound(nums.begin(), nums.end(), target));
}
// 如果未找到目标值,则返回应插入的位置
else {
return std::distance(nums.begin(), std::lower_bound(nums.begin(), nums.end(), target));
}
}
};
收获:跳出固定思维,多角度思考问题,掌握好所学知识。
谢谢大家,继续努力。