Leetcode---209长度最小子数组
209长度最小子数组
给定一个含有 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
暴力解法
是两个for循环,一个指向起始位置,一个指向结束位置,经历所有的区间集合,查看所有的区间元素的和是否大于S。再选择元素数最小的区间。
滑动窗口算法
有两个指针,一个指向起始位置i,一个指向结束位置j,在遍历的那一层我们选择让j来遍历,i和j的起始位置都是0也就是数组的开头,当sum值大于S时,酒啊开始让i开始移动,找寻最短的区间
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result= 100000;
int i=0;
int sum=0;
for(int j=0;j<nums.length;j++){
sum+=nums[j];
while(sum>=target){
result=Math.min(j-i,result);
sum-=nums[i];
i++;
}
}
return result;
}
}
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
这个题相对而言是简单的,但是注意是旧元素去往了新的位置。
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
int[] temp = new int[n];
System.arraycopy(nums, 0, temp, 0, n);
// 正确分割两部分
for (int i = 0; i < n; i++) {
nums[(i+k)%n]=temp[i];
// 正确顺序应为新位置接收旧元素
}
}
}