Java随手笔记(力扣牛客常用)----哈希表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

什么是哈希表:

直白来讲其实数组就是一张哈希表。哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:

一般哈希表都是用来快速判断一个元素是否出现集合里。 


一、常见的三种哈希结构

  • 数组
  • set (集合):基于map实现的,是一个不允许有重复元素的集合。
  • map(映射)

二、HashMap中基本操作

1.创建一个哈希表

HashMap<String,Integer> names=new HashMap<Integer,String>();

                   key     value

2.基本操作

添加键值对:names.put(1,"penny");

若map中存在key 则返回key对应的value值:getOrDefault(Object key, Object defaultValues); 

根据key值访问value:names.get(1);

根据key值删除元素:names.remove(1);

替换指定key对应的value:names.replace(key,value);

检查是否存在指定的key对应的映射关系:names.containsKey(key);

检查是否存在指定的value对应的映射关系:names.containsValue(value);

entrySet:
entrySet是 java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。用来遍历map的一种方法。

Set<Map.Entry<String, String>> entryseSet=map.entrySet();
 
for (Map.Entry<String, String> entry:entryseSet) {
    System.out.println(entry.getKey()+","+entry.getValue());
}

即通过getKey()得到K,getValue()得到V。


三、HashSet中基本操作

1.创建一个哈希表

HashSet<Integer> names=new HashSet<Integer>();

2.基本操作

添加元素:names.add("google");

删除元素:names.remove("Taobao");

判断元素是否存在于集合中:names.contains("Taobao");

删除集合中所有的元素:names.clear();

将集合转换为数组:return names.stream().mapToInt(x -> x).toArray(); 

计算集合中元素的数量:names.size();


四、三数之和 

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。


解题思路:
使用双指针法,如图所示:

首先将数组排序,再慢慢移动指针,找到满足条件的三个数,边找边去重。 四数之和也是同理,只是再加一层for循环。
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result=new ArrayList<>();
        Arrays.sort(nums);
        int len=nums.length;
        
        for(int i=0;i<len-2;i++)
        {
            int right=len-1;
            if(nums[i]>0)
              return result;
            if(i>0&&nums[i-1]==nums[i])
               continue;
            int left=i+1;
            while(left<right)
            {
                if(nums[i]+nums[left]+nums[right]==0)
            {
                List<Integer> list=new ArrayList<>();
                list.add(nums[i]);
                list.add(nums[left]);
                list.add(nums[right]);
                result.add(list);
                while (right > left && nums[right] == nums[right - 1]) right--;
                while (right > left && nums[left] == nums[left + 1]) left++;
                left++;
                right--;
            }
            else if(nums[i]+nums[left]+nums[right]>0)
            {
                right--;
            }
            else{
                left++;
            }
            }
            

        }
        return result;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值