哈希表的神奇應用!
1365.有多少小于當前數(shù)字的數(shù)字
題目鏈接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/
給你一個數(shù)組 nums,對于其中每個元素 nums[i],請你統(tǒng)計數(shù)組中比它小的所有數(shù)字的數(shù)目。
換而言之,對于每個 nums[i]你必須計算出有效的 j 的數(shù)量,其中 j 滿足 j != i 且 nums[j] < nums[i]?。
以數(shù)組形式返回答案。
示例 1:
- 輸入:nums = [8,1,2,2,3]
- 輸出:[4,0,1,1,3]
-
解釋:對于 nums[0]=8 存在四個比它小的數(shù)字:(1,2,2 和 3)。
對于 nums[1]=1 不存在比它小的數(shù)字。
對于 nums[2]=2 存在一個比它小的數(shù)字:(1)。
對于 nums[3]=2 存在一個比它小的數(shù)字:(1)。
對于 nums[4]=3 存在三個比它小的數(shù)字:(1,2 和 2)。
示例 2:
- 輸入:nums = [6,5,4,8]
- 輸出:[2,1,0,3]
示例 3:
- 輸入:nums = [7,7,7,7]
- 輸出:[0,0,0,0]
提示:
- 2 <= nums.length <= 500
- 0 <= nums[i] <= 100
思路
兩層for循環(huán)暴力查找,時間復雜度明顯為O(n^2)。
那么我們來看一下如何優(yōu)化。
首先要找小于當前數(shù)字的數(shù)字,那么從小到大排序之后,該數(shù)字之前的數(shù)字就都是比它小的了。
所以可以定義一個新數(shù)組,將數(shù)組排個序。
排序之后,其實每一個數(shù)值的下標就代表這前面有幾個比它小的了。
代碼如下:
vectorvec=nums;
sort(vec.begin(),vec.end());//從小到大排序之后,元素下標就是小于當前數(shù)字的數(shù)字
用一個哈希表hash(本題可以就用一個數(shù)組)來做數(shù)值和下標的映射。這樣就可以通過數(shù)值快速知道下標(也就是前面有幾個比它小的)。
此時有一個情況,就是數(shù)值相同怎么辦?
例如,數(shù)組:1 2 3 4 4 4 ,第一個數(shù)值4的下標是3,第二個數(shù)值4的下標是4了。
這里就需要一個技巧了,在構造數(shù)組hash的時候,從后向前遍歷,這樣hash里存放的就是相同元素最左面的數(shù)值和下標了。代碼如下:
inthash[101];
for(inti=vec.size()-1;i>=0;i--){//從后向前,記錄vec[i]對應的下標
hash[vec[i]]=i;
}
最后在遍歷原數(shù)組nums,用hash快速找到每一個數(shù)值 對應的 小于這個數(shù)值的個數(shù)。存放在將結果存放在另一個數(shù)組中。
代碼如下:
//此時hash里保存的每一個元素數(shù)值對應的小于這個數(shù)值的個數(shù)
for(inti=0;i
流程如圖:
關鍵地方講完了,整體C++代碼如下:
classSolution{
public:
vector<int>smallerNumbersThanCurrent(vector<int>&nums){
vector<int>vec=nums;
sort(vec.begin(),vec.end());//從小到大排序之后,元素下標就是小于當前數(shù)字的數(shù)字
inthash[101];
for(inti=vec.size()-1;i>=0;i--){//從后向前,記錄vec[i]對應的下標
hash[vec[i]]=i;
}
//此時hash里保存的每一個元素數(shù)值對應的小于這個數(shù)值的個數(shù)
for(inti=0;ireturnvec;
}
};
可以排序之后加哈希,時間復雜度為O(nlogn)
其他語言版本
Java:
publicint[]smallerNumbersThanCurrent(int[]nums){
Mapmap=newHashMap<>();//記錄數(shù)字nums[i]有多少個比它小的數(shù)字
int[]res=Arrays.copyOf(nums,nums.length);
Arrays.sort(res);
for(inti=0;iif(!map.containsKey(res[i])){//遇到了相同的數(shù)字,那么不需要更新該number的情況
map.put(res[i],i);
}
}
for(inti=0;ireturnres;
}
審核編輯 :李倩
-
數(shù)值
+關注
關注
0文章
80瀏覽量
14413 -
數(shù)組
+關注
關注
1文章
417瀏覽量
26034
原文標題:有多少小于當前數(shù)字的數(shù)字?
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結構】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
MASW-004103-1365單片開關英文手冊
數(shù)字輸出接口有哪些,數(shù)字輸出接口的作用
高校轉型數(shù)字化的原因有哪些
數(shù)字振蕩器的特點有哪些
數(shù)字振蕩器的實現(xiàn)要求有哪些
什么是數(shù)字孿生?它有哪些優(yōu)勢?
順應數(shù)字化趨勢!Flexus X 實例助力中小企業(yè)開啟數(shù)字轉型“必修課”
![順應<b class='flag-5'>數(shù)字</b>化趨勢!Flexus X 實例助力中小企業(yè)開啟<b class='flag-5'>數(shù)字</b>轉型“必修課”](https://file1.elecfans.com//web2/M00/01/21/wKgZomazja2AKRLdAAEksgd-3u8078.png)
LV1365-EX條碼識別模組在手持終端類中的應用
![LV<b class='flag-5'>1365</b>-EX條碼識別模組在手持終端類中的應用](https://file1.elecfans.com/web2/M00/05/C2/wKgZombelJ2AfdkkAAA_QB0UVwg701.png)
評論