8.22力扣题解

 力扣15三数之和

       首先定义一个二维数组,然后对原数组进行排序,然后遍历数组,如果第一个是正数(最小的数),那直接返回result也就是null

           然后开始去重,方法是在遍历i的时候,如果相邻的两个数相等,也就是说后一个数相等就continue,(这里用 nums[i] == nums[i - 1]而不是 nums[i] == nums[i + 1]是因为i的右值就是left这样导致整个结果集里面不能有重复的,但结果集是允许重复的)然后在i遍历的同时判断三数是否等于零,如果大于零就right--,如果小于零就left++(这里说一下,其实三数之和就是在一个数组里面枚举每一个项使其与另外两个项相加等于0,但是不能重复所以left是i+1,这样left之前的元素就不用重复遍历,也没重复,然后就是right,当left和i都满足之后其实right是确认的,但要满足和为零就要根据大小来遍历)然后就是left和right不能重复,所以也要去重,在right<left的情况下,同样也是相邻的比较如果相等索引值减一,或者加一直到最后一个相等的,然后在各自加一减一取新的索引值

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) {
                return result;
            }

            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            int left = i + 1;
            int right = nums.length - 1;
            while (right > left) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum > 0) {
                    right--;
                } else if (sum < 0) {
                    left++;
                } else {
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));

                    while (right > left && nums[right] == nums[right - 1]) right--;
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    
                    right--; 
                    left++;
                }
            }
        }
        return result;
    }
}

力扣1两数之和

 创建了一个HashMap为实例,名为hashtable注意,数组每个元素为键,索引为值

   循环找目标值与数组的差值这里是关键解释清楚一点,每次循环下如果差值匹配不上,就会将减数和他的索引返回到哈希表,因为实在哈希表里面找差值,找到的差值如果和前面的数组值相加等于target说明,该差值与数组值相加满足目标值,直接返回哈希表里的值就是相应的索引下标

class Solution {
    public int[] twoSum(int[] nums, int target) {
           Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        for(int i=0;i<nums.length;i++){
                if (hashtable.containsKey(target - nums[i])) {
                  return new int[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i],i);
        }
        return new int[0];
   }
}

 3无重复子字符串

  //先定义一个哈希表键为字符串,值为整型,用for循环遍历,这时候就用到了滑动窗口,如果dic里的子字符串没有发现与s字符串里的字符相等的,直接将这个字符和下标放入dic里面,如果有相等则将子字符串左端点向右移(这里向右移的方式是直接将s里第一次字符串的下标赋值给i,第二次字符才是相等的,而且方便算长度),最后算最长长度

class Solution {
    public int lengthOfLongestSubstring(String s) {
  
        Map<Character,Integer> dic=new HashMap<>();
        int res=-1,i=0;
        for(int j=0;j<s.length();j++){
            if(dic.containsKey(s.charAt(j)))
            i=Math.max(i,dic.get(s.charAt(j)));
            dic.put(s.charAt(j),j);
            res=Math.max(res,j-i);
        }
        return res;
   }
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值