最优的去重处理——HashSet去重
算法與數據結構是密不可分的,我們使用不同的數據結構和算法的組合就是我們解決問題的答案。
本篇我將就HashSet的特性和使用進行介紹。
HashSet有哪些特性呢?
HashSet繼承了Set接口,Set接口有如下特性:
1.元素的無序性 != 隨機性。真正的無序性,是指元素在底層存儲的位置是無序的。
2.不可重復性。當向Set集合中添加相同元素的時候,后面的這個添加不進去。程序不會報錯!
3.Set集合沒有自己獨有的方法,它的方法都是繼承于Collection接口中的現有方法
4.HashSet類是非線程安全的
5.允許集合元素值為null
而我們要講的就是他的不可重復性,它的不可重復性是如何保證的呢?
當向Set中添加對象時,會先調用此對象所在類的hashCode()方法,計算此對象對應的哈希值,此哈希值決定了此對象在Set中的存儲位置,如果此位置之前沒有對象存儲,則此對象直接存儲在這個位置上。反之,如果此位置之前已經有對象存儲,再通過equals()方法比較這兩個對象是否相同,equals()方法返回true,說明為同一個對象,那么這個對象就不會被添加進來。
在力扣上有一道非常簡單的題目,可以幫助我們很好的理解和使用HashSet 👇
力扣解題 575 分糖果
題目:給定一個偶數長度的數組,其中不同的數字代表著不同種類的糖果,每一個數字代表一個糖果。你需要把這些糖果平均分給一個弟弟和一個妹妹。返回妹妹可以獲得的最大糖果的種類數。
示例 1:
輸入: candies = [1,1,2,2,3,3]
輸出: 3
解析: 一共有三種種類的糖果,每一種都有兩個。
最優分配方案:妹妹獲得[1,2,3],弟弟也獲得[1,2,3]。這樣使妹妹獲得糖果的種類數最多。
示例 2 :
輸入: candies = [1,1,2,3]
輸出: 2
解析: 妹妹獲得糖果[2,3],弟弟獲得糖果[1,1],妹妹有兩種不同的糖果,弟弟只有一種。這樣使得妹妹可以獲得的糖果種類數最多。
注意:
- 數組的長度為[2, 10,000],并且確定為偶數。
- 數組中數字的大小在范圍[-100,000, 100,000]內。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/distribute-candies
public class _575_分糖果 {public static int distributeCandies(int[] candies) {//HashSet 去重最好的工具HashSet<Integer> set = new HashSet<Integer>();//遍歷數組,將數組中的元素添加至set中(重復則覆蓋)for (int candy : candies) {set.add(candy);}//判斷最后整個set中擁有的糖果種類數量和分到手中的糖果數量相比較返回小值return Math.min(set.size(), candies.length / 2);}//testpublic static void main(String[] args) {int [] a = {1,1,2,2,3,3};System.out.println(distributeCandies(a));}}
以上!
總結
以上是生活随笔為你收集整理的最优的去重处理——HashSet去重的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 伍六七带你学算法——栈的使用
- 下一篇: 什么是原码、反码、补码?什么是按位与?范