前天做二叉树的题,很难做下去,偶然间看到代码随想录,以后就按照这个顺序刷题吧
704. 二分查找-简单
重点:边界条件,确定好是用左闭右闭区间还是左闭右开区间
b站视频讲解
var search = function(nums, target) {
if(nums.length==0) return -1;
if(nums.length==1) return nums[0]==target?0:-1;
let l=0,r=nums.length-1;
while(l<=r){
let mid=Math.floor(l+(r-l)/2);
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
r=mid-1;
}else{
l=mid+1;
}
}
return -1;
};
35. 搜索插入位置-简单
①暴力
考虑四种情况:
目标值在数组所有元素之前
目标值等于数组中某一个元素
目标值插入数组中的位置
目标值在数组所有元素之后
var searchInsert = function(nums, target) {
for(let i=0;i<nums.length;i++){
if(nums[i]>=target) return i;
}
return nums.length;
};
时间复杂度:O(n)
空间复杂度:O(1)
②二分查找
var searchInsert = function(nums, target) {
const len=nums.length;
let l=0,r=len-1;
while(l<=r){
mid=Math.floor((l+r)/2);
if(nums[mid]<target){
l=mid+1;
}else if(nums[mid]>target){
r=mid-1;
}else{
return mid;
}
}
// return l;
// 因为在 nums[mid]
return r+1;
};
①先二分查找,再左右滑动指针找区间
var searchRange = function(nums, target) {
let index=binarySearch(nums,target);
if(index==-1) return [-1,-1];
const ans=[];
let left=index,right=index;
while(left-1>=0&&nums[left-1]==target){ //防止数组越界。逻辑短路,两个条件顺序不能换
left--;
}
while(right+1<nums.length&&nums[right+1]==target){
right++;
}
ans[0]=left;
ans[1]=right;
return ans;
};
var binarySearch=function(nums,target){
let l=0,r=nums.length-1;
while(l<=r){
let mid=Math.floor(l+(r-l)/2);
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
l=mid+1;
}else{
r=mid-1;
}
}
return -1;
};
重点:用两次二分分别寻找左右边界,该 边界不包含target !不包含target!不包含target!

var searchRange = function(nums, target) {
const getLeftBorder=(nums,target)=>{
let l=0,r=nums.length-1;
let leftBorder=-2;
while(l<=r){
let mid=Math.floor(l+(r-l)/2);
if(nums[mid]>=target){
r=mid-1;
leftBorder=r;
}else{
l=mid+1;
}
}
return leftBorder;
}
const getRightBorder=(nums,target)=>{
let l=0,r=nums.length-1;
let rightBorder=-2;
while(l<=r){
let mid=Math.floor(l+(r-l)/2);
if(nums[mid]<=target){
l=mid+1;
rightBorder=l;
}else{
r=mid-1;
}
}
return rightBorder;
}
let leftBorder=getLeftBorder(nums,target);
let rightBorder=getRightBorder(nums,target);
// 情况一
if(leftBorder===-2||rightBorder===-2) return [-1,-1];
//情况三
if(rightBorder-leftBorder>1) return [leftBorder+1,rightBorder-1];
// 情况二
return [-1,-1];
};
其实没看懂怎么找的左右边界...
69. x 的平方根 -简单
①二分
var mySqrt = function(x) {
if(x<=1) return x;
let l=0,r=x-1;
while(l<=r){
mid=Math.floor((l+r)/2);
if(mid*mid>x){
r=mid-1;
}else if(mid*mid<x){
l=mid+1;
}else{
return mid;
}
}
return r;
};
367. 有效的完全平方数-简单
①二分
var isPerfectSquare = function(num) {
let l=0,r=num-1;
if(num<=1) return true;
while(l<=r){
mid=Math.floor(l+(r-l)/2);
if(mid*mid>num){
r=mid-1;
}else if(mid*mid==num){
return true;
}else{
l=mid+1;
}
}
return false;
};