給你乙個陣列 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]
暴力法
對於陣列中的每乙個元素,都遍歷一遍陣列,統計小於當前元素的數的數目
class
solution
} arr[i]
=m;}
return arr;
}}
hashmap對映
我們在這裡使用hashmap建立索引與所在資料的的鍵值對,然後通過對nums進行排序,則排序後的陣列中所在資料對應的索引即為小於該數的數目。
class
solution
arrays.
sort
(nums)
;for
(int j =
0;j
)return data;
}}
測試結果:
。。。這些看似是沒有問題,但是可能有些同學在已經看出來**有問題,或者說提交時並沒有通過,emmmm…這裡的想法有乙個嚴重的前提限制,因為我們使用了hashmap來存放nums陣列及對應索引,但是hashmap是不允許有存在重複的鍵的,但是nums陣列中元素是可以重複的。所以此項解法是錯誤的,
3.快速排序
正確解法:使用二維陣列存放nums陣列中資料及對應索引
class
solution
//對data陣列進行排序
arrays.
sort
(data,
newcomparator
<
int[
]>()
});int
ret =
newint
[n];
int prev =-1
;//根據排序後的data陣列中的索引來獲取小於此資料的數目
for(
int i =
0; i < n; i++
) ret[data[i][1
]]= prev;
}return ret;
}}
至此,這一題已經寫出了兩種解法,寫本部落格的目的主要是想記錄和分享一下本人在第二種解法時 的思路錯誤問題,沒有將題目條件考慮周全,提前給像我一樣思路的人把這個坑給跳過。 LeetCode140 有多少小於當前數字的數字
給你乙個陣列 nums,對於其中每個元素 nums i 請你統計陣列中比它小的所有數字的數目。換而言之,對於每個 nums i 你必須計算出有效的 j 的數量,其中 j 滿足 j i 且 nums j nums i 以陣列形式返回答案。示例 1 輸入 nums 8,1,2,2,3 輸出 4,0,1,...
有多少小於當前數字的數字
給你乙個陣列 nums,對於其中每個元素 nums i 請你統計陣列中比它小的所有數字的數目。換而言之,對於每個 nums i 你必須計算出有效的 j 的數量,其中 j 滿足 j i 且 nums j nums i 以陣列形式返回答案 第一次解題用的暴力解法 用時 24ms public stati...
有多少小於當前數字的數
給你乙個陣列 nums,對於其中每個元素 nums i 請你統計陣列中比它小的所有數字的數目。換而言之,對於每個 nums i 你必須計算出有效的 j 的數量,其中 j 滿足 j i 且 nums j nums i 以陣列形式返回答案。示例 1 輸入 nums 8,1,2,2,3 輸出 4,0,1,...