56. 合并区间 mid
思路
先以数组索引0的大小排序数组
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] row1, int[] row2) {
return Integer.compare(row1[0], row2[0]);
}
});
注意 row1, row2 不能颠倒
遍历数组,如果前一个数组的右边界大于等于当前数组左边界,不收集当前数组,并更新前一个数组的右边界为二者右边界中更大的
否则,直接收集该数组
if (intervals[i][0] <= result.getLast()[1]) {
result.getLast()[1] = Math.max(intervals[i][1], result.getLast()[1]);
} else {
result.add(intervals[i]);
}
189.轮转数组 mid
思路:
方法一:三次翻转
复杂度分析
- 时间复杂度:O(n),其中 n 是 nums 的长度。
- 空间复杂度:O(1)。
238.除自身以外数组的乘积 mid
思路
乘积 = 当前数左边的乘积 * 当前数右边的乘积
前缀乘积数组 后缀乘积数组 相乘
41. 缺失的第一个正数
思路
原地哈希
缺失的第一个正数 i 就是第一个 nums[i] != i + 1的
没有出现的最小的正整数
= 第一个不满足要求的元素下标
+ 1
这些数组都是最理想的情况下提供的数组,很显然现实状况不可能这么理想。
怎么把随机的数组优化成最理想的数组呢?
我们使用原题提供的nums = [3,4,-1,1]来演示交换过程:
swap(当前位置元素<---->目的位置元素)
目的位置: nums[i] - 1
也就是 值为4的元素 要放到下标为 3 的位置
只在 (0,len]这个左开右闭区间才进行交换操作
因为我们不知道超出这个范围的元素应该换到哪里
总结:
第一遍历先将能对应 nums[i] != nums[nums[i] - 1] 的都对应上
第二遍找第一个nums[i] != i + 1, i + 1
图片和部分文字作者:PrideBias
链接:https://leetcode.cn/problems/first-missing-positive/solutions/1142914/duo-tu-yu-jing-xiang-jie-yuan-di-ha-xi-b-se25/
来源:力扣(LeetCode)