力扣数组专题(3)

长度最小的子数组

题目来源:
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值