leetcode.977有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
因为是对平方之后的数进行排序,负数的平方可能更大,而平方之后最大的负数在最左边,平方之后最大的正数在最右边,此时用双指针法,最左最右各一个指针对数组进行遍历:新建一个新数组result(长度和原数组大小相等),左指针与右指针进行遍历,平方更大的数放入新数组result中。
class Solution {
public int[] sortedSquares(int[] nums) {
int fast=0,slow=nums.length-1;
int k=nums.length-1;
int[] result=new int[nums.length];
while(fast<=slow){ //注意是 ’<=‘而不是’<‘ 否则会漏掉一个元素
if(nums[fast]*nums[fast]<nums[slow]*nums[slow]){
result[k--]=nums[slow]*nums[slow]; //右边更大,右边平方存入result,右指针向左移动一位
//新数组 result因为每次存的是最大数,所以从尾部开始更新
slow--;
}else{
result[k--]=nums[fast]*nums[fast];
fast++;
}
}
return result;
}
}
209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
暴力解法
class Solution { //暴力解法
public int minSubArrayLen(int target, int[] nums) {
int result=Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++){ //两个for循环 外层for循环确定左边界 内for循环 从外循i起点开始遍历 确定右边界
int sum=0;
for(int j=i;j<nums.length;j++){
sum+=nums[j];
if(sum>=target){
result=Math.min(result,j-i+1);
break;
}
}
}
return result==Integer.MAX_VALUE?0:result;
}
}
利用两个指针left,right使用滑动窗口方法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left=0,right=0;
int result=Integer.MAX_VALUE; //定义一个result变量存储当前数组长度
int sum=0;
for(right=0;right<nums.length;right++){ //快指针先向后遍历,当sum和大于等于target时停止,然后开始操作慢指针向后遍历,只要满足sum>=target,寻找出最小的子序列。
sum+=nums[right];
while(sum>=target){
result=Math.min(result,right-left+1);
sum-=nums[left];
left++;
}
}
return result==Integer.MAX_VALUE?0:result;
}
}
标签:平方,right,nums,int,day02,result,数组
From: https://www.cnblogs.com/wdnmdp/p/16720843.html