通过这么久的坚持,终于把数组中的【简单】部分的题目做完了,做了这么多,也该来一次小小的总结。
通过数组的练习,了解了这一类题的常用思路和方法
1.使用多重循环一步步遍历求解
2.将数组存入Map中,然后利用map中的方法进行解答
3.双指针法,定义两个索引,对数组进行遍历
4.有时从头往后遍历不能解决问题,那么可以尝试从后往前进行遍历
5.在【66.加一问题】中将每位数通过相除(/)判断是否进位,通过取余(%)给每位数对应的值,
在遇到进位问题时,可以考虑使用这种方法
6.分治算法来解决问题,通过将一个大的问题分成很多个小块,然后每个小块负责各自的功能
7.在遇到【53.最大子序和】这类问题时,可以通过边累加边判断,在 求和之后的值 和 求和之前的值 之间取较大/小的值
8.在遇到搜索问题时,请首先考虑二分查找,如果不行,再考虑普通的搜索方式
9.遇到移除元素时,不一定要真正的删除,可以将其替换掉
10.大家可能觉得将【杨辉三角】【杨辉打印II】出来可能有点难度,可以换个角度思考问题,不需要第一步就将杨辉三角的结构和数据都对应上你可以先将杨辉三角初始化,将结构构建出来,然后再将对应的值进行替换。
对于构建结构,可以使用List>进行构建
对于数据替换,可以先初始化为1,然后通过上一层之和,求出下一层的值,然后对其进行修改赋值。
11.对于盈利问题时【121.买股票的最佳时机】【122.买卖股票的最佳时机II】,
对于只能买卖一次的情况:可以先进行判断是否继续,继续下去是盈利还是亏损,记录每次的利润将其和目前求得的利润 取最大值。
对于可以买卖多次的情况: 判断下一次的值是否比这次的大,如果大,直接相减,将差值进行累加。
12.在进行查找时,我们可以对已经查找到的值做一个标记,使其表示已存在,在【448.找出所有数组消失的数】中,将已经存在的值标记为负数,然后将1-n不为负数的值输出
13.【求第三大的数】,或者求第二大的数,模板如下:
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max){
thirdMax = secondMax;
secondMax = max;
max = nums[i];
}else if (nums[i] > secondMax && nums[i] < max){
thirdMax = secondMax;
secondMax = nums[i];
}else if (nums[i] > thirdMax && nums[i] < secondMax){
thirdMax = nums[i];
}
}
将赋值最大值max之前先将之前的max赋值给第二大的值secondMax
赋值第二大的值secondMax之前先将之前的secondMax赋值给第三大的值
14.数组移动问题:
向前移动:举例:【283.移动零】
/**
* 前移
* @param nums
* @param index
*/
public static void move(int[] nums,int index){
for (int i = index + 1; i < nums.length; i++) {
nums[i - 1] = nums[i];
}
}
向后移动:
从后面开始遍历,nums[i] = nums[i - 1]
15. 利用异或求解(^),一个数连续异或两个相同的数,得到的结果为其本身,例如:1 ^ 2 ^ 2 = 1,案例:【268.缺少数字】
16. 利用%可以防止重复移动【189. 旋转数组】
17. Set集合在数组去重方面,会有奇效
18.注意map.put()方法是有返回值的,如果key值不存在,则返回null,如果存在,则返回上一个key值【219. 存在重复元素II】
19. 在【169.求众数】的时候,很多人想到的是将其出现的个数计算出来,其实不需要,只需给每个值进行统计,当某个值相同时则count++,否则count--,当count=0时,对下一个值进行统计(注意:这种方法适用于数组中一定存在众数的情况)。
20. 从两边搜索比每次从头开始的速度要快很多
22. 【566.重塑数组】中,为了防止数组越界,利用int类型相除,小于必为0,取余小于必为本身的方法,对索引值进行了限定
public static int[][] matrixReshape(int[][] nums, int r, int c) {
int n = nums.length,m = nums[0].length;
if (r * c != n*m){
return nums;
}
int[][] res = new int[r][c];
for (int i = 0; i < r * c; i++) {
res[i/c][i%c] = nums[i/m][i%m];
}
return res;
}
23. 可以利用map中 jdk1.8的新特性map.getOrDefault(),统计数组中每个值出现的个数
Map的新方法getOrDefault(Object,V)允许调用者在代码语句中规定获得在map中符合提供的键的值,否则在没有找到提供的键的匹配项的时候返回一个“默认值”。
24. 可以多多利用三元运算符
25. 【697.求数组的度】中需要统计数组的度(即出现次数最多的值开始索引与结束时索引差的长度),以及随时更新重复数的索引,以及保存第一次出现改值的索引,使用了Map
26. 【 695.岛屿的最大面积】中使用递归求岛屿的面积,当计算了一个值,就将其置为0,递归的算法就是判断其周围有没有1,如果有继续递归,如果没有,则直接返回0
27. 多多利用公式,使其更容易理解【888.公平的糖果交换】
28.多多利用中间值和最终值进行比较,【849.到最近的人的最大距离】
29.看清题型,并觉得最终的输出类型以及使用的数据结构
30. 在【746.使用最小花费爬楼梯】时,有时数组需要进行扩容然后进行判断,在原数组无法选择最后走出的路径时
31.最后一点总结,不要钻牛角尖,这样会浪费你的很多时间!!!
喜欢本文的话,可以关注一下公众号,每天定时更新一篇学习日记,让我们一起成长!