Leetcode1512. 好数对的数目 抽出本质原型 利用范围条件
解法1:暴力枚舉
class Solution {public int numIdenticalPairs(int[] nums) {int count = 0;for(int i = 0;i < nums.length; i++){for(int j = i + 1; j < nums.length; j++){if(nums[i] == nums[j])count++;}}return count;} }沒啥可說的,就是小學(xué)數(shù)學(xué)問題…
解法2:類比:求解重復(fù)數(shù)字的個(gè)數(shù)
這道題的本質(zhì),其實(shí)就是求解重復(fù)數(shù)字的個(gè)數(shù),只不過,統(tǒng)計(jì)的是對(duì)兒數(shù),統(tǒng)計(jì)規(guī)則不一樣而已!,也就是
- 數(shù)字有1個(gè),0對(duì)兒
- 數(shù)字有2個(gè),1對(duì)兒
- 數(shù)字有3個(gè),1+2 = 3對(duì)兒
- 數(shù)字有4個(gè),1+2+3 = 6對(duì)兒
- ……
小學(xué)數(shù)學(xué),想起來沒?
寫法1:利用題目限制條件
我們直接開一個(gè)長(zhǎng)度100的數(shù)組就行了。
class Solution {public int numIdenticalPairs(int[] nums) {int sum = 0;int[] arr = new int[100];for(int v: nums){sum += arr[v-1];arr[v-1]++;}return sum;} }這樣一來,我們?yōu)槿靠赡艹霈F(xiàn)的數(shù)字都分配了一個(gè)位置,也就是數(shù)組下標(biāo),如果數(shù)字出現(xiàn),就記錄一次,然后總的記錄也按照統(tǒng)計(jì)規(guī)則進(jìn)行。
寫法2:利用哈希表
對(duì)于上述寫法,確實(shí)容易,但是浪費(fèi)空間,而且如果題目沒有這個(gè)限制呢?其實(shí)我們可以看到記錄某個(gè)數(shù)字重復(fù)次數(shù),其實(shí)可以用哈希表記錄呀!
How to use HashMap in Java?
class Solution {public int numIdenticalPairs(int[] nums) {// Using HashMapHashMap<Integer,Integer> hashMap = new HashMap<>();Integer sum = 0;for(int value: nums){sum += hashMap.getOrDefault(value,0);hashMap.put(value,hashMap.getOrDefault(value,0) + 1);}return sum;} }getOrDefault方法,就是
- 如果有這個(gè)關(guān)鍵字,就返回關(guān)鍵字對(duì)應(yīng)的值
- 如果沒有,就返回設(shè)置的默認(rèn)值
哈希表的本質(zhì),其實(shí)就是值查找。
小結(jié)
對(duì)于這個(gè)好數(shù)對(duì)兒題目,本質(zhì)是另外一道題,也就是統(tǒng)計(jì)一個(gè)數(shù)組中,有哪些重復(fù)的數(shù)字,且記錄他們出現(xiàn)的次數(shù)。
至于好數(shù)對(duì)兒,只是按照n(n-1)/2的方式記錄而已,小學(xué)數(shù)學(xué)不多說。
總結(jié)
以上是生活随笔為你收集整理的Leetcode1512. 好数对的数目 抽出本质原型 利用范围条件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷的门票多少钱一张
- 下一篇: leetcode面试题 10.01. 合