力扣刷题指南
刷题类型
数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构
数组
1、首先要掌握
想法简单的,实现起来不一定容易
数组的存储方式:数组是存放在连续内存空间上的相同类型数据的集合
- 数组的下标是从0开始的
- 数组在内存中的地址是连续的,因此删除或增加元素 时需要移动其他的元素
普通的删除操作如下图所示:
时间复杂度是O(n),不适合做频繁的增删操作
二维数组其实就是一个矩阵
int[][] rating = new int[3][4]
在内存中的空间地址并不是3*4连续的
而是四条连续的地址空间组成
2、35题 数组的元素插入问题
给了一个无重复升序数组和一个目标值,找到目标值则返回索引,如果目标值不存在,则返回按顺序插入的位置
示例 1:
输入: [1,3,5,6], 5
输出: 2示例 2:
输入: [1,3,5,6], 2
输出: 1示例 3:
输入: [1,3,5,6], 7
输出: 4示例 4:
输入: [1,3,5,6], 0
输出: 0
- 暴力解法很好写:
class Solution {
public int searchInsert(int[] nums, int target) {
for(int i = 0; i < nums.length; i++) {
if(nums[i]>=target) {
return i;
}
}
return nums.length;
}
}
时间复杂度O(n),空间复杂度O(1)
- 主要是仔细思考一下二分法:
有序数组是二分查找的基础条件
注意这里target定义的是左闭右闭的,所以while判断条件当min=max时,区间[min, max]依然有效。
最后返回的max+1,是找不到对应target元素的时候,考虑三种情况:
- 目标值在所有元素之前 此时min和max都指向了第一个元素下标为0,且执行了max-1操作,所以返回max+1=0;
- 目标值插入数组中的位置 此时min和max都指向了小于目标值的第一个元素,假设要插入的位置是n,且执行了max-1操作,所以返回max+1=n;
- 目标值在所有元素之后 此时min和max都指向了最后一个元素下标为nums.length,且执行了max-1操作,所以返回max+1=nums.length;
class Solution {
public int searchInsert(int[] nums, int target) {
int min = 0;
int max = nums.length-1;
int mid = 0;
while(min <= max){
mid = (int) ((max+min)/2);
if(target == nums[mid]) {
return mid;
}else if(target > nums[mid]) {
min = mid + 1;
}else{
max = mid - 1;
}
}
return max+1;
}
}
时间复杂度O(log n),空间复杂度O(1)
思考一下左闭右开的target怎么写?
3、27题 数组元素的移除
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的