【哈希表专题】—— 两数之和、三数之和

LeetCode 1: 两数之和

在这里插入图片描述
⭕️ 解题思路:

对于本题是可以通过双层for循环暴力求解的,但时间复杂度为O(n^2),因为利用哈希表查找是最快的,所以此处通过哈希表来解题

(1)创建一个哈希表,遍历数组,如果哈希表中存在 target - nums[i],那么返回索引

(2)如果不存在,就将当前元素值与索引构造成键值对添加到哈希表中

(3)因为我们最后要的是两个索引值,所以将数组中元素的数值设置为哈希表的 Key,将元素的索引设置为 Key


关于哈希表的基础操作:

//创建哈希表
HashMap<Integer, String> map = new HashMap<Integer, String>();
//添加键值对
map.put(key, value);
//根据key查看value
map.get(key);
//根据key删除键值对
map.remove(key);
//查看哈希表中是否包含key的键值对
map.containsKey(key)
//判断哈希表是否为空
map.isEmpty();
//统计哈希表中键值对的数量
map.size();
//替换哈希表中的键值对
map.replace(key, value);

📖 代码部分:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //创建一个哈希表
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		//遍历数组
        for(int i = 0; i < nums.length; i++){
            int n = target - nums[i];
            if(map.containsKey(n)){
                return new int [] {map.get(n), i};
            }
            map.put(nums[i], i);
        }

        return new int[0];

    }
}

LeetCode 15:三数之和

在这里插入图片描述

排序 + 双指针法

⭕️ 解题思路:
(1)创建一个集合[大集合里套小集合]
(2)利用Arrays.sort()对数组进行排序,因为后面要用到这条性质
(3)遍历数组,如果数组的第一个元素大于零,说明数组没有满足条件的集合,如果当前数组元素的值与前一个值相同,那么直接调到下一次循环

(4)准备第二次循环,设置两个指针,左指针为当前元素的下一个元素,右指针指向数组元素的最后一个,将这三个数组元素的值加和,如果sum 大于零,那么将右指针左移,如果sum小于零,那么将左指针右移,否则就利用Arrays中的asList()方法将数组中的元素转化为集合

(5)然后更新左右指针,如果左指针的下一个元素与当前元素相同,那么就一直将左指针右移,但要保证左指针小于右指针;对于右指针的处理方法与左指针相同。然后再将左指针向右移动一个位置,右指针向左移动一个位置

(6)最后返回创建的集合

代码部分:

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[0] > 0){
            return result;
        }
            if(i > 0 && nums[i] == nums[i - 1]){
                continue;
            }
            
            int left = i + 1;
            int right = nums.length - 1;
            while(left < right){
                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(left < right && nums[left] == nums[left + 1]){
                        left++;
                    }
                    while(left < right && nums[right] == nums[right - 1]){
                        right--;
                    }
                    left++;
                    right--;
                }
            }
        }





        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bow.贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值