我是靠谱客的博主 忐忑鸵鸟,最近开发中收集的这篇文章主要介绍leetcode每天5题-Day221.二分查找2.搜索插入位置3.在排序数组中查找元素的第一个和最后一个位置4.x的平方根5.有效的完全平方数,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
目录
- 1.二分查找
- 2.搜索插入位置
- 3.在排序数组中查找元素的第一个和最后一个位置
- 4.x的平方根
- 5.有效的完全平方数
前天做二叉树的题,很难做下去,偶然间看到代码随想录,以后就按照这个顺序刷题吧
????二分查找解析
1.二分查找
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;
};
2.搜索插入位置
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]<target 这个判断条件里 r已经+1了
return r+1;
};
3.在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置-中等
①先二分查找,再左右滑动指针找区间
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];
};
其实没看懂怎么找的左右边界...
4.x的平方根
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;
};
5.有效的完全平方数
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;
};
最后
以上就是忐忑鸵鸟为你收集整理的leetcode每天5题-Day221.二分查找2.搜索插入位置3.在排序数组中查找元素的第一个和最后一个位置4.x的平方根5.有效的完全平方数的全部内容,希望文章能够帮你解决leetcode每天5题-Day221.二分查找2.搜索插入位置3.在排序数组中查找元素的第一个和最后一个位置4.x的平方根5.有效的完全平方数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复