【LeetCode刷题】Day 12
题目1:69. x的平方根
思路分析:
就是查找,暴力的话就是要注意整形溢出问题,二分的话是要注意二分区间划分的问题。
思路1:暴力枚举
代码实现:
class Solution {
public:
int mySqrt(int x) {
if(x==0) return 0;
for(int i=1;i<=x;i++) //循环条件不能i<x+1哦,因为x+1可能整形溢出
{
if((long long )i*i>x) return i-1;
else if((long long )i*i==x) return i;
}
return 0;
}
};
思路2:二分查找
-
这跟我们区间右值模板相同:
- 第一步:划分 -> 二分区间:[平方小于等于x][平方大于x];
-
第二步:分析:返回值在左区间,所以
left = mid
不需要跳出区间,相对right
就需要right = mid -1
;
代码实现:
class Solution {
public:
int mySqrt(int x) {
if(x==0) return 0;
int left=1,right=x;
while(left<right)
{
long long mid=left+(right-left+1)/2;
if(mid*mid>x) right=mid-1;
else left=mid;
}
return left;
}
};
题目2:35.搜索插入位置
思路分析:
先分析返回位置:如果找到就返回该位置下标,没找到就返回这个值该插入该有序数组的位置。
思路1:二分查找
-
二分查找:
- 第一步:划分 - > 二分区间:[小于等于target][大于target];
-
第二步:分析:
返回值在左区间,左值不变右值变
right-1
,有-1
中点更新就+1
; -
第三步:处理返回值:只有当
target>nums[left]
,返回left+1
;
代码实现
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<right)
{
int mid=left+(right-left)/2;
if(nums[mid] < target) left=mid+1;
else right=mid;
}
if(nums[left]<target) return left+1;
else return left;
}
};
以过客之名,祝你岁岁平安! ~天天开心🎈