您的位置:首页 > 其它

[LeetCode]1365. 有多少小于当前数字的数字

2020-03-27 19:21 489 查看

1365. 有多少小于当前数字的数字

给你一个数组 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

思路

1.使用暴力法双循环解。

public int[] smallerNumbersThanCurrent(int[] nums) {
int[] a=new int[nums.length];

for (int i = 0; i < nums.length; i++) {
int count=0;

for (int j = 0; j < nums.length; j++) {
if (nums[i]>nums[j]) {
count++;
}
a[i]=count;
}

}

return a;
}

2.复制一份原数组并进行排序,遍历排序后的数组,每个元素的下标索引就代表数组中有多少小于它的数。将值作为key,索引为value放入map中,然后再遍历原数组,将对应元素的索引值取出来,放入新的数组中。

public int[] smallerNumbersThanCurrent(int[] nums) {
int n = nums.length;
int[] temp = Arrays.copyOf(nums, n);
Arrays.sort(temp);
Map<Integer, Integer> map = new HashMap<>();

for(int i = 0; i < n; i++){
if(i == 0){
map.put(temp[i],0);
}else{
//假如是temp[i]==temp[i-1],即相邻两个数相等,则第二个值不需要放入map,他用第一个数的索引。
if(temp[i] > temp[i-1]){
map.put(temp[i],i);
}
}
}

for(int i = 0; i < n; i++){
temp[i] = map.get(nums[i]);
}

return temp;
}

3.数组中的元素取值为[0,100],使用频次数组加前缀和的解法。前缀和类似于思路2中排序后的索引。

public int[] smallerNumbersThanCurrent(int[] nums) {

//频次数组
int[] hash = new int[101];
for (int num : nums) {
hash[num]++;
}
//前缀和数组,存放元素前面有多少个小于它的元素个数。
for (int i = 1; i < hash.length; i++) {
hash[i] = hash[i] + hash[i - 1];
}
//结果数组
int[] temp = new int[nums.length];
for (int i = 0; i < r.length; i++) {
if (nums[i]>0){
temp[i] = hash[nums[i] - 1];
}
}

return temp;
}
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
小菜Tcc 发布了14 篇原创文章 · 获赞 13 · 访问量 285 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐