数组-类型总结

题目类型

找出缺失的值

找出缺失的值有三种思路:

  1. 位运算(异或) 相同的数字会变成0
  2. 求和
  3. 哈希
  • 面试题 17.19. 消失的两个数字
    用上面总结的三个方法都可以处理。
    异或的思路:在元素组的基础上在异或1到len+2的数字便可以让缺失的数字只出现一次,而其他数字都出现了两次。

  • AAAA473. 火柴拼正方形
    尝试把火柴填入四个桶中,火柴遍历结束之后,若四个桶的包含的长度相同,则说明可以构成正方形。

区间

两数之和

  • AAA1995. 统计特殊四元组
    把a+b+c=d转换成a+b=d-c,然后统计满足a+b=d-c的个数。每次遍历新的b,都会得到新的c,也就得到新的d-c,把d-c加入到map集合中,用map集合匹配a+b与d-c。
  • 454. 四数相加 II
    把a+b+c+d = 0转成计算a+b存储下来计算c+d的时候,判断是否存在-(a+b)。

奇怪的遍历方式

判断重复元素

*219. 存在重复元素 II
*220. 存在重复元素 III
36. 有效的数独
把数组中的数字转成一个二维数组的第二维下标,若这个二维数组的内容已经被修改过了,说明存在相同的元素。示例:
217. 存在重复元素
Stream的方法distinct() 返回由此流的不同元素组成的流。
299. 猜数字游戏
用两个数组分别记录两个两个字符串相同的数字个数,遍历数组取较小值是两者的交集,即公共的数字个数。

接雨水 用数组存储左右两边遍历的结果

模拟

回文

多路归并

在两个数组中寻找第k大的数

其他

  • AAA977. 有序数组的平方
    原数组两端的绝对值大,中间越是靠近0,绝对值越小,绝对值由大到小遍历。
  • AAA605. 种花问题
  • 若左右两边都是0,则当前位置便可以是1,记录数量超过等于n就返回true。

技巧

给数组赋值

除基本类型的数组,其他类型的数组在赋值之前需要初始化,否则会报空指针异常。
在这里插入图片描述

集合List与数组互相转换 (仅限包装类型,基本类型不可以)

数组转集合List Arrays.asList()

String[] str1 = new String[]{"wd"};
List<String> stringList = Arrays.asList(str1);

集合List转数组 toArray()

String[] str2 = stringList.toArray(new String[stringList.size()]);

//参考“LeetCode57. 插入区间”的代码
List<int[]> list = new ArrayList<>();
list.toArray(new int[0][]);

在这里插入图片描述

Arrays.equals()

给一个数组排序却不变动原数组

新建一个数组idx存储原数组的下标,然后按照原数组的大小给idx排序。
如,下面的代码就是给nums2的下标排了序:

Integer[] idx = new Integer[n];
for (int i = 0; i < n; i++) {
    idx[i] = i;
}
Arrays.sort(idx,(a,b)->(nums2[a]-nums2[b]));

构建List[]数组

List<Integer>[] adjoin = new List[n+1];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值