704. 二分查找
题目建议: 大家能把 704 掌握就可以,35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
题目链接: 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
python(左闭右闭)
class Solution(object):
def search(self, nums, target):
left,right=0,len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]>target:
right=mid-1
elif nums[mid]<target:
left=mid+1
else:
return mid
return -1
C++(左闭右开)
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size(); //表示右边为开
while (left<right) //left == right在区间[left, right)是没有意义的
{
int mid=(left+right)>>1; //往右是除取整,往左是乘取整
if (nums[mid]>target)
right=mid; //表示右边为开
else if (nums[mid]<target)
left=mid+1;
else{
return mid;
}
}
return -1;
}
};
总结
二刷也算是把左闭右开的给学会了。
27. 移除元素
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
Python
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast=0
slow=0
while fast<len(nums):
if nums[fast]!=val:
#这边只要保证nums[0]-nums[slow]的数是对的就行
#所以相等的时候slow不动,就不改变值,也可以避免越界的情况
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow
C++
#暴力版
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size=nums.size();
for (int i=0;i<size;i++){
if (nums[i]==val){
for (int j=i+1;j<nums.size();j++){
nums[j-1]=nums[j];
}
i--;
size--;
}
}
return size;
}
};
#while版
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast=0,slow=0;
while (fast<nums.size())
{
if (nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
#for版
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for (int fast=0;fast<nums.size();fast++){
if (nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
总结
二刷学会了for的写法也还是可以的。
35.搜索插入位置
Python
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left,right=0,len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]<target:
left=mid+1
else:
right=mid-1
return left
C++
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
int mid;
while (left<=right){
mid=(left+right)>>1;
if (nums[mid]>target){
right=mid-1;
}else if (nums[mid]<target){
left=mid+1;
}else{
return mid;
}
}
if (nums[mid]<target){
return mid+1;
}
else{
return mid;
}
}
};
总结
这边没找到目标函数,其实不需要再在下面检查是否小于target,因为在上面已经可以判断了。
34. 在排序数组中查找元素的第一个和最后一个位置
Python
#我的代码
class Solution:
def searchIndex(self,nums,target):
left,right=0,len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]>target:
right=mid-1
elif nums[mid]<target:
left=mid+1
else:
return mid
return -1
def searchRange(self, nums: List[int], target: int) -> List[int]:
result=self.searchIndex(nums,target)
if result==-1:
return [-1,-1]
left=right=result
while nums[left]==target:
if left-1>=0:
left-=1
else:
left-=1
break
while nums[right]==target:
if right+1<len(nums):
right+=1
else:
right+=1
break
return [left+1,right-1]