LeetCode简单题之有多少小于当前数字的数字
題目
給你一個數組 nums,對于其中每個元素 nums[i],請你統計數組中比它小的所有數字的數目。
換而言之,對于每個 nums[i] 你必須計算出有效的 j 的數量,其中 j 滿足 j != i 且 nums[j] < nums[i] 。
以數組形式返回答案。
示例 1:
輸入:nums = [8,1,2,2,3]
輸出:[4,0,1,1,3]
解釋:
對于 nums[0]=8 存在四個比它小的數字:(1,2,2 和 3)。
對于 nums[1]=1 不存在比它小的數字。
對于 nums[2]=2 存在一個比它小的數字:(1)。
對于 nums[3]=2 存在一個比它小的數字:(1)。
對于 nums[4]=3 存在三個比它小的數字:(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
來源:力扣(LeetCode)
解題思路
??考慮一個最樸素的做法——排序,排序之后如果數組中的數字都是不重復的,那么一個數字當前所在的位置前有多少個數字,便是結果,如果存在相同的數字就需要加一個統計變量來處理重復的情況。我們以示例1為例子代入代碼中查看具體的情況。
class Solution:def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:temp=[0]*len(nums)#nums = [8,1,2,2,3]L=sorted(enumerate(nums),key=lambda x:x[1])#enumerate(nums)=[(0, 8), (1, 1), (2, 2), (3, 2), (4, 3)]#L=[(1, 1), (2, 2), (3, 2), (4, 3), (0, 8)]count=1 #重復統計量for i in range(1,len(nums)):if L[i][1]>L[i-1][1]:temp[i]=temp[i-1]+countcount=1elif L[i][1]==L[i-1][1]:temp[i]=temp[i-1]count+=1#temp=[0, 1, 1, 3, 4]S=sorted(zip(L,temp),key=lambda x:x[0][0])#zip(L,temp)=[((1, 1), 0), ((2, 2), 1), ((3, 2), 1), ((4, 3), 3), ((0, 8), 4)]#S=[((0, 8), 4), ((1, 1), 0), ((2, 2), 1), ((3, 2), 1), ((4, 3), 3)]#這一步其實可以用鍵值對來優化return [i[1] for i in S] #返回第三列
??當然這個題給定了范圍數組內的元素最大也不過100,所以我還可以開辟一個100長度的數組,把原本的數組元素映射成位置信息,把頻率作為新的元素,這樣就可以方便統計了。
class Solution:def smallerNumbersThanCurrent(self, nums: List[int]) -> List[int]:temp=[0]*101for i in nums:temp[i]+=1for i in range(100,0,-1):if temp[i]!=0:temp[i]=sum(temp[0:i])ans=[]for i in nums:if i!=0:ans.append(temp[i])else:ans.append(0)return ans
總結
以上是生活随笔為你收集整理的LeetCode简单题之有多少小于当前数字的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode简单题之数组中的字符串匹
- 下一篇: LeetCode中等题之简易银行系统