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