子串算法题
子串
- 1、和为k的子数组
- 2、滑动窗口最大值
1、和为k的子数组
解题思路:这道题我是采用的两层for循环遍历,因为题目要求的是子数组要连续,所以只需要按顺序将数组里面的值加到sum,一旦和为k,cnt就加一,继续遍历。
class Solution {public int subarraySum(int[] nums, int k) {int cnt = 0;for(int i = 0;i<nums.length;i++){int sum = 0;for(int j = i;j<nums.length;j++){if((sum+nums[j])==k){cnt++;}sum+=nums[j];}}return cnt;}
}
2、滑动窗口最大值
解题思路:采用双向队列,始终维持滑动窗口中最大的值。在加入一个数的时候要判断前面有没有比他小的,如果有就从双向队列的后面弹出。并且要比较存到队列里面的数是不是在滑动窗口的范围内。最后队列的顶部元素就是这个的这一段滑动窗口的最大值。
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length==0||k<=0||nums==null){return new int[0];}int[] result = new int[nums.length-k+1];Deque<Integer> ans = new LinkedList<>();for(int i = 0;i<nums.length;i++){while(!ans.isEmpty()&&ans.peekFirst()<i-k+1){ans.pollFirst();}while(!ans.isEmpty()&&nums[ans.peekLast()]<nums[i]){ans.pollLast();}ans.offerLast(i);if(i>=k-1){result[i-k+1] = nums[ans.peekFirst()];}}return result;}
}