hot100 数组

最大子数组和,在一个数组中找出和最大的子数组

思路:

这边要发现位置为i的子数组的最大值=max( (pre+nums[i]), nums[i] )。pre表示i前面一个位置的最大字串和。时间复杂度o

(n)。

核心代码:

for (int x : nums) {

pre = Math.max(pre + x, x);

maxAns = Math.max(maxAns, pre);

}

合并区间,合并区间数组中的重合区间

思路:

首先将区间进行排序,记录区间的上限,与下一个区间下限进行比较,再记录区间上限,知道合并重合的区间。依次遍历。时间复杂度o(n)空间复杂度o(n)

核心代码: Arrays.sort(intervals, new Comparator<int[]>() { public int compare(int[] interval1, int[] interval2) { return interval1[0] - interval2[0]; } });

return merged.toArray(new int[merged.size()][]);

轮转数组,将数组向右循环平移k个

思路:借助空间按(i+k)%n的规律填充新数组。这样空间复杂度o(n)。可以进行优化嘛,借用自身空间或是找规律,可以找规律,每个数都向右平移一次替代,会找到。第二就是反转数组。

除自身外数组的乘积

思路:

那就算出除了其自身以外之前的乘积,之后的乘积。这样前*后就可以得到了。o(n)时间复杂度,o(n)空间复杂度。减少时间复杂度,由于输出的可以不算空间复杂度,就可以借助这一类空间,让这个空间先存储每个除自身之外之前的乘积,在从后面遍历,由于不需要记忆因此,可以用一个变量存储每次,之后的乘积。

核心代码:

for (int i = length - 1; i >= 0; i--) { // 对于索引 i,左边的乘积为 answer[i],右边的乘积为 R answer[i] = answer[i] * R; // R 需要包含右边所有的乘积,所以计算下一个结果时需要将当前值乘到 R 上 R *= nums[i]; }

缺失的第一个正数,在一个数组中找到其所有值中缺失的最小整数

思路: 最简单,打表,因为最小的整数不可能大于数组中n的大小。因此开一个大小为n的数组,在这个范围内的数进行打表记录。最后遍历一遍表得到最大值,但是其时间复杂度为o(n)。

简化时间复杂度可以利用自身这个数组的空间进行打表。遍历这个表在这个区间[1,n]的数字,与这个位置的数字进行交换,最后遍历表即可。

for (int i = 0; i < n; ++i) { while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) { int temp = nums[nums[i] - 1]; nums[nums[i] - 1] = nums[i]; nums[i] = temp; } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值