题目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; } };
以过客之名,祝你岁岁平安! ~天天开心🎈