暴力搜索:
c++
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int index=0;
int i=0;
while(i<nums.size() && nums[i]<=target){
if (nums[i]==target){
index = i;
return index; // 如果有target,返回index
}
i++;
}
return i; /// 如果没有target,返回插入位置
}
};
python
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
index = 0
i=0
while i<len(nums) and nums[i]<=target: # c &&, python and
if nums[i] == target:
index = i
return index # 如果有target,返回index
i+=1 # python 没有i++
return i # 如果没有target,返回插入位置
二分查找:
c++
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l = 0;
int r = nums.size()-1;
int mid = 0;
while(l<=r){
mid = (l+r)/2;
if(target == nums[mid]){
return mid;
}else if (target < nums[mid]){
r = mid - 1;
}else{
l = mid + 1;
}
}
return l;
}
};
python
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
l, r = 0,len(nums)-1 # 左右下标
while l<=r: # 循环条件 左下标小于右下标
mid = (l+r)//2 # 中间下标 python 向下取整://
if target == nums[mid]:
return mid
elif target < nums[mid]: # 中间下标对应值 大于 目标值,(二分左短右长)
r = mid - 1 # 二分右长收缩至 中间下标左一位
else:
l = mid + 1 # 二分左长右短,二分左长收缩至 中间下标右一位
return l
c++ 二分查找函数:
C++ lower_bound 与 upper_bound 函数
头文件: #include
二分查找的函数有 3 个:
lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置。
upper_bound(起始地址,结束地址,要查找的数值) 返回的是 第一个大于待查找数值 出现的位置。
binary_search(起始地址,结束地址,要查找的数值) 返回的是是否存在这么一个数,是一个bool值。
注意:使用二分查找的前提是数组有序。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
return lower_bound(nums.begin(),nums.end(),target) - nums.begin();
}
};
// lower_bound 返回的是一个迭代器,它要减去nums.begin()这个迭代器得到的差值才是下标的编号。