欧克吖~
我是悟 空,经历了前一个月各种面试,在算法方面被 “算法题按在地上打、摩擦~”。
决定细心革面重新刷题:开启LeetCode模式:备战秋招了!
我会把自己刷题的代码放在这里做参考。
如果对你有用的话,可以关注我的更新,大家一起成长!
今天是 167. 三数之和。 属于 两数之和的变形。
送给大家:"王也道长"的一句话:
422:重复的数据
思路:我们可以取创建 一个 容量大小为 当前输入数组的最大值的长度 的数组 array
例如: 输入的数组 最大值为 8:我们就创建一个数组大小的为8的数组:
- 以此遍历目标数组:把目标数组的值 == array的下标!
- 在遍里array就可以找到重复的值:
public class _422ArrayIndex {
public static void main(String[] args) {
int[] arr = {4, 3, 2, 7, 8, 2, 3, 1};
System.out.println(ArrayIndex(arr));
}
// 1. 创建一个数组 将arr的值 对应array的下标。遍历 找到所有次数的数字 array 时间复杂度 n
// 2.用list。add 将所有满足的次数==2 的 加入list 返回list; 时间复杂度 n
// 空间复杂度 2n
public static List<Integer> ArrayIndex(int[] arr) {
int[] array = new int[arr.length];
for (Integer num : arr
) {
// 数组从0开始的 所以 num-1;
int index = num - 1;
// 往后遍历array
array[index]++;
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < array.length - 1; i++) {
if (array[i] == 2) {
list.add(i + 1);
// 不止一个 继续往后找
}
}
return list;
}
方法2:
来进行 空间复杂度的优化:
思路:这就是运用一些数学的逻辑来去实现的:一共两种思路:
- 找到对应下标位置: 将其变成 负数: 如果重复 :判断条件:当插入时 为负数 则说明 重复!
- 找到对应下标位置: 将其变成 *+最大数字n: 如果重复 :判断条件:当插入时 数字大于 2n 则说明 重复! 要注意: 变换后的数 number 和 下标 index的关系: index =(number-1)%n
//2.用自身的数组 来表示 有本身的负数
public static List<Integer> ArrayIndex2(int[] arr) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
// Math.abs(arr[i]的取绝对值 保证为正树 来报正 index 的值为整数
int index = Math.abs(arr[i]) - 1;
if (arr[index] < 0) {
list.add(Math.abs(arr[i]));
} else {
arr[index] = -arr[index];
}
}
return list;
}
// 3.遍历每次进行+n 如果出现了两次了 就会大于2n 直接list
public static List<Integer> ArrayIndex3(int[] arr) {
int length = arr.length;
for (int i = 0; i < length; i++) {
// 关键点: 就是处理后的 数组值和原来值得关系 =》 (arr[i]-1)%n
// 按照上面的关系 进行预处理
int index = (arr[i] - 1) % length;
arr[index] += length;
}
//存放关系值
List<Integer> list = new ArrayList<>();
for (int i = 0; i < length; i++) {
if (arr[i] > (2 * length)) list.add(i + 1);
}
return list;
}
本次的:力扣—Everyday: 就分享到这~
我们下次见~