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

╰半橙微兮° 2023-07-25 09:44 137阅读 0赞

题目来源

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

题目描述

在这里插入图片描述
在这里插入图片描述

题目解答

暴力循环法

c++

  1. vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
  2. vector<int> res;
  3. int cnt , curr;
  4. for (int i = 0; i < nums.size(); ++i) {
  5. cnt = 0;
  6. curr = nums[i];
  7. for (int j = 0; j < nums.size(); ++j) {
  8. if (i == j){
  9. continue;
  10. }
  11. if (curr > nums[j]){
  12. cnt++;
  13. }
  14. }
  15. res.emplace_back(cnt);
  16. }
  17. return res;
  18. }

在这里插入图片描述

java

  1. public static int[] soloution1(int [] array){
  2. int [] res = new int[array.length];
  3. for (int i = 0; i < array.length; i++) {
  4. int count = 0;
  5. for (int j = 0; j < array.length; j++){
  6. if (i != j){
  7. if (array[j] < array[i]){
  8. count++;
  9. }
  10. }
  11. }
  12. res[i] = count;
  13. }
  14. return res;
  15. }

解答2:排序

c++

写法

  1. class Solution {
  2. public:
  3. vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
  4. int len = nums.size();
  5. vector<pair<int, int>> sort_vec;
  6. for (int i = 0; i < len; ++i) {
  7. sort_vec.emplace_back(pair{
  8. nums[i], i});
  9. }
  10. std::sort(sort_vec.begin(), sort_vec.end());
  11. vector<int> res(len, 0);
  12. int prev = -1;
  13. for (int i = 0; i < len; ++i) {
  14. if (prev == -1 || sort_vec[i - 1].first != sort_vec[i].first){
  15. prev = i;
  16. }
  17. res[sort_vec[i].second] = prev;
  18. }
  19. return res;
  20. }
  21. };

在这里插入图片描述

写法

  1. vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
  2. vector<int> res(nums.size(), 0);
  3. vector<int> sort_vec = nums;
  4. std::sort(sort_vec.begin(), sort_vec.end());
  5. int curr, index;
  6. for (int i = 0; i < nums.size(); ++i) {
  7. curr = nums[i];
  8. index = 0;
  9. for (int j = 0; j < sort_vec.size(); ++j) {
  10. if (sort_vec[j] >= curr){
  11. break;
  12. }
  13. index++;
  14. }
  15. res[i] = index;
  16. }
  17. return res;
  18. }

在这里插入图片描述

java

  1. /* *//*
  2. * 思路: 复制一份原数组并进行排序, 得到一个临时数据
  3. * 循环临时数据, 用一个map记录下各个数据的索引位置。
  4. *
  5. * 循环原始元素,获取map中对应的索引值,返回即可
  6. * 比如 [8,1,2,2,3]
  7. * */
  8. public static int[] soloution2(int []nums){
  9. int[] temp = Arrays.copyOf(nums, nums.length);
  10. Arrays.sort(temp);
  11. Map<Integer, Integer> mapIndex = new HashMap<>();
  12. for(int i = 0; i < temp.length; i++){
  13. if (!mapIndex.containsKey(temp[i])){
  14. mapIndex.put(temp[i], i);
  15. }
  16. }
  17. int[] res = new int[nums.length];
  18. for (int i = 0; i < nums.length; i++){
  19. res[i] = mapIndex.get(nums[i]);
  20. }
  21. return res;
  22. }

解答3:计数排序[最快]

数组中的元素取值为[0,100],使用频次数组加前缀和的解法

cpp

  1. vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
  2. vector<int> hash(101, 0);
  3. for(int iter : nums){
  4. hash[iter]++;
  5. }
  6. vector<int> freq(101, 0);
  7. freq[0] = 0;
  8. freq[1] = freq[0];
  9. for (int j = 2; j < 101; ++j) {
  10. freq[j] = freq[j - 1] + hash[j - 1];
  11. }
  12. vector<int> res(nums.size());
  13. for (int i = 0; i < nums.size(); ++i) {
  14. res[i] = freq[nums[i]];
  15. }
  16. return res;
  17. }

java

  1. public static int[] smallerNumbersThanCurrent(int[] nums){
  2. //频次数组---- 每个数字出现多少次
  3. int[] hash = new int[101];
  4. for (int num : nums) {
  5. hash[num]++;
  6. }
  7. // 数组中的元素取值为[0,100]
  8. // 统计比i小的元素的个数
  9. int[] freq = new int[101];
  10. freq[0] = 0;
  11. freq[1] = hash[0];
  12. for (int i = 2; i < hash.length; i++) {
  13. freq[i] = freq[i-1] + hash[i - 1];
  14. }
  15. // 此时: hash数组中, 值是比索引小的元素个数
  16. // 循环原数组
  17. int[] res = new int[nums.length];
  18. for (int i = 0 ; i < nums.length; i++){
  19. res[i] = freq[nums[i]];
  20. }
  21. return res;
  22. }

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读