class Solution {
public int subarraySum(int[] nums, int k) {
int left = 0;
int right = 0;
int sum = 0;
int count = 0;
for (left=0;left<nums.length;left++){
sum = 0;
for (right=left;right<nums.length;right++){
sum += nums[right];
if (sum==k) count++;
}
}
return count;
}
}
class Solution {
public int subarraySum(int[] nums, int k) {
int[] preSum = new int[nums.length+1];
int left = 0;
int right = 0;
for (int i=0;i<nums.length;i++){
preSum[i+1] = preSum[i] + nums[i];//下标为i+1元素之前的和
}
int count = 0;
for (left=0;left<nums.length;left++){
for (right=left;right<nums.length;right++){
if (preSum[right+1]-preSum[left]==k) count++;//代表下标为left到right的区间和
}
}
return count;
}
}
class Solution {
public int subarraySum(int[] nums, int k) {
//key代表前缀和,value代表数量
HashMap<Integer,Integer> map = new HashMap<>();
map.put(0,1);
int result = 0;
int pre = 0;
for (int i=0;i<nums.length;i++){
pre += nums[i];
//类似于前缀【righ】-前缀【left】= k
//所以这是前缀pre - 判断是否有的这一部分 = k
if (map.containsKey(pre-k)){
result += map.get(pre-k);
}
map.put(pre,map.getOrDefault(pre,0)+1);
}
return result;
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length==1) return nums;
MyQueue myque = new MyQueue();
for(int i=0;i<k;i++){
myque.add(nums[i]);
}
int[] result = new int[nums.length-k+1];
int num = 0;
result[0] =myque.peek();
for (int i=k;i<nums.length;i++){
myque.poll(nums[i-k]);
myque.add(nums[i]);
result[i-k+1] = myque.peek();
}
return result;
}
}
class MyQueue{
Deque<Integer> que = new LinkedList<>();
void poll(int value){
if (!que.isEmpty() && value==que.peek()){
que.poll();
}
}
void add(int value){
while(!que.isEmpty() && value>que.getLast()){
que.removeLast();
}
que.add(value);
}
int peek(){
return que.peek();
}
}
class Solution {
public String minWindow(String s, String t) {
int[] rec = new int[128];
int count = 0;//记录t的总字符数量
for (int i=0;i<t.length();i++){
rec[t.charAt(i)]++;
count++;
}
//必须选择start为-1,如果从0开始很可能和左窗口重合
int r = 0, l=0, start=-1, size=Integer.MAX_VALUE;
for(r=0;r<s.length();r++){
//判断是s[r]是否在t里面
if (rec[s.charAt(r)]>0){
count--;
}
rec[s.charAt(r)]--;
//t的字符已经全部在窗口里面
if (count==0){
//右移动左窗口,移动至窗口第一个是t里面的字符
while(rec[s.charAt(l)]<0){
rec[s.charAt(l)]++;
l++;
}
//更新窗口大小【选择小的一方】
if (r-l+1<size){
size = r-l+1;
start = l;
}
//移动左侧窗口,这时已经不满足t全部在窗口里面的条件
rec[s.charAt(l)]++;
l++;
count++;
}
}
return size==Integer.MAX_VALUE ? "" : s.substring(start,size+start);
}
}