leetcode中「有多少小於當前數字的數字」題解

2021-10-25 06:37:08 字數 1910 閱讀 5907

給你乙個陣列 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,...