长度最小的子数组
题目来源:
leetcode 209. 长度最小的子数组 https://leetcode.cn/problems/minimum-size-subarray-sum/
思想:
滑动窗口
题解:
执行用时:1 ms, 在所有 Java 提交中击败了99.99% 的用户
内存消耗:48.8 MB, 在所有 Java 提交中击败了44.07% 的用户
通过测试用例:20 / 20
import java.util.*;
class Solution {
public int minSubArrayLen(int target, int[] nums) {
if(nums[0] >= target){
return 1;
}
int first = 0;
int sum = 0;
int min = Integer.MAX_VALUE;
int flag = 0;
for(int last = 0; last < nums.length; last++){
sum += nums[last];
if(sum >= target){
while(sum >= target){
min = Math.min(last - first + 1,min);
sum -= nums[first++];
}
flag = 1;
}
}
if(flag == 1){
return min;
}
return 0;
}
}
解释一下:
我们定义first来作为滑动窗口的左边,定义last作为滑动窗口的右边,sum是这个窗口中所有元素的和,当sum加上last所指向的数字后结果是大于等于target,那么last指针就不用动了,你这时候应该贪婪的想想,我左边能不能移动一下让这个窗口变得更小并且sum还能大于等于target呢。这就是这道题的关键所在
删除有序数组中的重复项
题目来源:
leetcode 26.删除有序数组中的重复项 https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
思想:双指针
我第一眼看见这题,这不简简单单两个数组一个循环一个index。后来我腚眼定眼一瞧,原地删除,介可怎么弄呢,我一看,双指针吧!
题解:
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:43.4 MB, 在所有 Java 提交中击败了14.37% 的用户
通过测试用例:361 / 361
class Solution {
public int removeDuplicates(int[] nums) {
if(nums.length == 1){
return 1;
}
int first = 0;
int last = 1;
while(true){
if(last == nums.length)break;
if(nums[first] == nums[last]){
last ++;
}
else{
first ++;
nums[first] = nums[last];
last ++;
}
}
return first + 1;
}
}
解释一下,一个first指针,一个last指针。last指针前去探索,如果保证探索到的元素不与first指向的元素相等了,那么就可以放在first元素的后一个位置,并且first指向first+1的位置。知道last前方没有地方再探索也就是last == nums.length为止。最后返回first+1(因为起始索引为0)