代码随想录算法训练营第一天| 数组理论基础
一、随想录链接
二、今日任务
704. 二分查找
遇到的困难
并未遇到明显困难
解题思路
十分常规的二分法,之前有做过这题,花了三分钟成功ac,之前是考虑左闭右闭的写法,代码如下:
class Solution {
public int search(int[] nums, int target) {
int right = nums.length-1;
int left = 0;
while(left<=right){
int middle =(left + right)/2;
if(nums[middle] == target){
return middle;
}else if(nums[middle] > target){
right = middle - 1;
}else if(nums[middle] < target){
left = middle + 1;
}
}
return -1;
}
}
看完代码随想录后的收获:
1、两个整型相加一定要注意越界问题(项目中曾经吃过大亏,再次警醒自己);
2、使用左闭右开的方法重新做一遍 代码如下:
class Solution {
public int search(int[] nums, int target) {
int right = nums.length;
int left = 0;
while(left< right){
int middle =(left + right)/2;
if(nums[middle] == target){
return middle;
}else if(nums[middle] > target){
right = middle ;
}else if(nums[middle] < target){
left = middle + 1;
}
}
return -1;
}
}
3、简单总结一下我对于二分法的注意重点,如果有兄弟对于这个有意见或者是补充的十分欢迎指导
- 注意选择区间
- 在实现代码时要注意代码的判断条件是否符合区间的合法性
27. 移除元素
遇到的困难
见到这种题目就暴力法解决,确实是自身的代码能力十分的薄弱 ,暴力法代码:
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length;
for(int i = 0;i < length; i++){
if(nums[i] == val){
for(int j = i+1;j < length;j++){
nums[j-1] = nums[j];
}
i--;
length--;
}
}
return length;
}
}
解题思路
看完卡尔哥的视频后茅塞顿开,简单总结一下快慢指针的大概用法
- 快指针在遍历数组的过程中筛选元素
- 慢指针将符合条件的元素加入到数组当中
附上代码
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int first = 0;first < nums.length;first++){
if(nums[first] != val){
nums[slow] = nums[first];
slow++;
}
}
return slow;
}
}
三、今日用时及总结
- 从20:18~21:42 包括写相关博客的时间
- 暴露出代码量的问题,而且开始的时间比较晚没有完成多余的题目
- 快慢指针的应用以及二分法的边界处理是今日的主要收获,明日留出多一点的时间做巩固题目写入明日的博客当中