刷题小记五:普通数组

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值