力扣算法系统刷题题解记录
文章目录
- 力扣算法系统刷题题解记录
- 前言
- 一、数组
- 704二分查找
- 示意图:
- 解题思路
- 代码
- 27.移除元素
- 示意图
- 解题思路
- 代码
前言
参考顺序和资料:《代码随想录》
二刷要认真做笔记啦,加油!
一、数组
704二分查找
日期:2023.4.12
示意图:
解题思路
注意边界:左闭右闭 [left,right] while(left<=right) //右边界合法可以取到right
左闭右开 [left,right] while(left<right) //右边界不合法不可以取到right所以没有等号
1.设置左标记和右标记 左小于右 注意是下标
2.中间值: mid=(left+right)/2;或者 mid = (right-left)/2+left;
3.分别判断中间下标对应的值大于和小于目标值对应的左右标记的变化情况。
if(nums[mid]<target){ //注意是下标对应的值和目标值对比
left = mid +1; //左边闭的说明可以取到left,所以left=mid+1效率更高
if(nums[mid]>target){
right = mid - 1;//右边闭的说明可以取到right,所以left=mid-1效率更高
4.当left=right=mid,nums[mid]=target的时候就找到了target,,返回 mid,否则没有找到返回-1
代码
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while(left<=right){
int mid=(left+right)/2; //或者mid = ()
if(nums[mid]<target){ //注意是下标对应的值和目标值对比
left = mid +1; //左边闭的说明可以取到left,所以left=mid+1效率更高
}else if(nums[mid]>target){
right = mid - 1;//右边闭的说明可以取到right,所以left=mid-1效率更高
}else{
return mid;
}
}
return -1;
}
}
未完待续
27.移除元素
示意图
解题思路
双指针思路时间复杂度O(n)
快指针 用于获取新数组中的元素
慢指针 获取新数组需要更新的位置
fast无论什么情况下都+1;slow在不等于要删的元素下才加一
时间复杂度:
O(n),其中 n 为序列的长度。我们只需要遍历该序列至多一次。
空间复杂度:
O(1)我们只需要常数的空间保存若干变量。
代码
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0; //用于获取新数组中的元素
int slow = 0; //慢指针用于获取新数组所需要更新的位置
for(fast = 0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow; //返回数组的个数
}
}