@代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
第一天开始好好刷题,目标是多种语言一起学,主要c++和java,辅修go。
代码随想录算法部分
任务链接https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY
数组理论基础
文章链接:文章
题目建议: 了解一下数组基础,以及数组的内存空间地址,数组也没那么简单。
704. 二分查找
题目建议: 大家能把 704 掌握就可以,35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
题目链接:力扣704
文章讲解:文章
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715
做题简述:这道题已经背下来了所以很简单。但是面试中遇到了更深入的提问,并没有很好的回答,在提示可以限制二分循环判定条件后才解决。故加强练习。
学习到的刷题知识点。java数组的长度函数是nums.length
,然后public的修饰地点与c++不同。
C++代码如下
class Solution {
public:
//左闭右闭
int search(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){
return mid;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
// //左闭右开
// int search(vector<int>& nums, int target) {
// int left = 0,right = nums.size();
// while(left < right){
// int mid = left + (right - left) / 2;
// if(nums[mid] == target){
// return mid;
// }else if(nums[mid] > target){
// right = mid;
// }else{
// left = mid + 1;
// }
// }
// return -1;
// }
};
java代码如下:
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length-1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
}
go的代码风格和前两者非常不同
// func search(nums []int, target int) int {
// right := len(nums) - 1
// left := 0
// for left <= right{
// mid := left + (right - left)/2
// if nums[mid] == target{
// return mid
// }else if nums[mid] > target{
// right = mid - 1
// }else {
// left = mid + 1
// }
// }
// return -1
// }
func search(nums []int, target int) int {
right := len(nums)
left := 0
for left < right{
mid := left + (right - left)/2
if(nums[mid] == target){
return mid
}else if(nums[mid] > target){
right = mid
}else {
left = mid + 1;
}
}
return -1
}
27. 移除元素
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
简述:双指针法,不需要删除最后面的元素。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for(int fast = 0; fast < nums.size(); fast++){
if(val != nums[fast]) nums[slow++] = nums[fast];
}
return slow;
}
};