LeetCode–数组
日积月累,坚持每天更新
刷完题后不单单是能够把题做出来,更重要的是需要从这个题里面学到什么方法,仅此在这里记录下自己的想法总结
一、数组-双指针法
26. 删除排序数组中的重复项
26.1 题目:
26.2 结题
26.3 总结:
- 题目要求
原地删除、修改输入数组
,就是直接在输入的数组上面操作,不用再借助额外的存储空间,从而达到空间复杂度为:O(1) 双指针
按照我的理解有点像在数组上有两个人,一个人(快指针)负责出去找新的元素,另外一个人(慢指针)负责存储有用的,自己需要的元素。当寻找的那个人,将数组中元素全部寻找一遍之后,负责存储的那个人那里就是全部自己需要的元素了。- 上面的题解还可以继续优化,当数组没有重复元素时,就会进行不必要的元素复制,可以在元素复制之前添加一个判断,判断之间的间隔是否大于1,若大于1,则说明中间有空元素,需要进行复制
二、二分查找
35、搜索插入位置
题目
题解
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) { //边界条件是left小于等于right
int mid = (left + right) / 2;
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
}
总结
- 是在图解算法这本书里面看过的
二分查找
,讲的还是比较清晰易懂,当时是在上班途中地铁上看的,并没有具体实践,这次做题正好遇见二分查找的题目 使用的条件
就是首先满足数字是排好顺序的,然后找其中某个数字的位置,这一类相关的感觉都可以使用,最主要的好处就是比暴力遍历要快,时间复杂度变为O(logn),随着数据量的变大,时间并不会呈爆炸式增长- 二分查找使用并不困难,有点类似递归,有点麻烦的在于递归
边界条件
,这道题里面可以举几个例子,就不难看出当left=right时,虽然比较特殊,但还是可以进行比较的,之后再往下进行循环递归,就会出现left>right,这显然不满足我们最开始的假设,所以边界条件就设为left<=right
//二分查找模板
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1; // 注意
while(left <= right) { // 注意
int mid = (left + right) / 2; // 注意
if(nums[mid] == target) { // 注意
// 相关逻辑
} else if(nums[mid] < target) {
left = mid + 1; // 注意
} else {
right = mid - 1; // 注意
}
}
// 相关返回值
return 0;
}
}