给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
文章讲解:代码随想录
视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili
第一眼的想法:第一想法肯定是暴力解法,就是把所有数先平方然后再排序,时间复杂度是O(nlogn),进阶是O(n),但是想不出来。
看完讲解:双指针法果然是厉害,我以后遇到类似问题的时候可以考虑这种方法。同时要注意循环条件。
class Solution {
public int[] sortedSquares(int[] nums) {
int right = nums.length-1;
int left = 0;
int[] result = new int[nums.length];
int i, j;
for (i = 0, j = right; i <= j; ){
if (nums[i]*nums[i] > nums[j]*nums[j]){
result[right--] = nums[i]*nums[i];
i++;
}else{
result[right--] = nums[j]*nums[j];
j--;
}
}
return result;
}
}
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
第一眼的想法:第一想法是暴力解法,但是没考虑初始化结果为最大值。
看完讲解:滑动窗口实际上也是双指针。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE; //初始化最大值,涵盖了所有情况
int sum = 0;
int left = 0;
for (int right = 0; right < nums.length; right++){
sum += nums[right];
while (sum >= target){
result = Math.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
文章介绍了如何使用双指针法解决LeetCode中的两个问题:有序数组的平方,通过比较元素原值和平方值的大小来保证非递减顺序;以及长度最小的子数组,利用滑动窗口减少计算复杂度。
261






