java-数组中有多少小于当前数字的数字

题目描述

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。

示例

java-数组中有多少小于当前数字的数字_第1张图片

方法一

代码:

package haxibiao;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

//1365  有多少小于当前数字的数字
class SOkltion {
    public int[] smallerNumbersThanCurrent(int[] nums) {
            int n = nums.length;
            int[] temp = new int[n];
            temp = Arrays.copyOf(nums, n);  //复制nums数组给数组temp
            Arrays.sort(temp); //将数组temp进行排序
            Map<Integer, Integer> map = new HashMap<>();  //创建哈希表
            map.put(temp[0],0);  //将数组的第一个元素放入哈希表中
           //遍历数组temp这里要解决的问题是消除temp中元素相等的情况,将元素相等的情况的元素剔除掉,哈希集合中只存储元素不等的键值对
            for(int i = 1;  i < n;  i++){
                if(temp[i] > temp[i-1]){
                    map.put(temp[i],i);
                }
            }
            //遍历数组nums,取出nums[i]值对应的键,将该键赋值给temp数组,就得到了nums[i]中比对应元素小的个数
            for(int i = 0; i < n; i++){
                temp[i] = map.get(nums[i]);
            }
            return temp;
        }

    public static void main(String[] args){
        int[] nums ={8,1,2,2,3};
        SOkltion sxc = new  SOkltion();
        sxc.smallerNumbersThanCurrent(nums);
    }
}

代码说明

1.首先这里使用哈希表解决,主要的思路就是哈希表解决,首先将哈希表进行排序,那么哈希表的键对应的就是题目中所说明的比该元素小的个数。
2.首先我们创建一个数组temp, 并且将nums的结果赋值给temp,再对数组temp进行升序排列;创建一个哈希表。升序后的数组的第一个元素和其索引值放进哈希表中。
3.遍历数组 temp,从索引为1的开始,比较temp数组中相邻元素的大小,如果如果出现元素相等的情况,只记录相等元素中索引最小的情况的值,并将该值和索引放进哈希表中。
4.最后的一步就是遍历原数组 nums[i], 使用HashMap的 get() 方法,取出nums[i]值对应的键,并将这键赋值给数组temp数组,最后数组的数组temp,就是nums数组中一一对应的每一个元素比它们小的元素的个数。

方法二 暴力法

package haxibiao;

//1365  有多少小于当前数字的数字   暴力解法
class Sdgf {
    public int[] smallerNumbersThanCurrent(int[] nums) {
        int n =nums.length;
        int[] s1 = new int[n];
        int ans = 0;
        int t = 0;
        //双层循环实现所有数组元素直接的一一比较
        for(int i =0; i < n; i++ ){
            ans = 0;   //用来计数的变量
            for(int j = 0; j < n; j++){
                if(nums[j] < nums[i]) {
                    ans++;
                }
            }
            s1[t++] = ans;   //每一个元素对应的比它小的元素的个数
        }
       return s1;
    }
}

你可能感兴趣的:(数据结构试题,数据结构,数据结构,leetcode)