日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Leetcode1365】有多少小于当前数字的数字:详解

發(fā)布時間:2024/9/27 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Leetcode1365】有多少小于当前数字的数字:详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[Leetcode1365] 有多少小于當前數(shù)字的數(shù)字

1. 題目

給你一個數(shù)組 nums,對于其中每個元素 nums[i],請你統(tǒng)計數(shù)組中比它小的所有數(shù)字的數(shù)目。

換而言之,對于每個 nums[i] 你必須計算出有效的 j 的數(shù)量,其中 j 滿足 j != i 且 nums[j] < nums[i] 。

以數(shù)組形式返回答案。

2. 算法原理

  • 暴力遍歷法
  • 桶計數(shù)法
  • 3. 暴力遍歷

    從題干分析需求,

    步驟1. 對于單個index上的數(shù)字nums[index],都需要遍歷一遍整個數(shù)組nums統(tǒng)計有多少數(shù)據(jù)比nums[index]小。

    步驟2. 而統(tǒng)計完整個數(shù)組nums,需要完成數(shù)組長度numsSize次循環(huán)。

    因此采用雙重循環(huán)暴力遍歷就可以得到結(jié)果。

    // 分析結(jié)構(gòu) // input @ int *nums 輸入數(shù)組指針 // @ int numsSize 輸入數(shù)組長度 // output @ int *returnSize 輸出數(shù)組長度 // return @ int * 輸出數(shù)組指針 int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize){// 設置輸出數(shù)組,并初始化int *numsout = (int *)malloc(sizeof(int) * numsSize);memset(numsout, 0, numsSize *sizeof(int));int i, j;for (i = 0; i < numsSize; i++) { //外循環(huán),按順序依次選定一個nums[i]for (j = 0; j < numsSize; j++) { // 遍歷一次數(shù)組,遇到nums[j] < nums[i]時,統(tǒng)計數(shù)組cal_less[i]對應位置加1if (nums[j] < nums[i]) {numsout[i]++;}}}// 輸出結(jié)果*returnSize = numsSize;return numsout; }

    4. 桶計數(shù)

    從題干分析需求,(在數(shù)組值較小時,(0 < nums[i] < 100),可以使用桶計數(shù) )

    步驟1. 建立桶數(shù)組,桶數(shù)組的下標對應著nums的數(shù)據(jù)取值范圍(本文是0 - 100),初始化為0。

    步驟2. 單次遍歷nums數(shù)組,桶數(shù)組記錄每個數(shù)據(jù)出現(xiàn)的頻數(shù)。

    步驟3. 題干要求統(tǒng)計數(shù)組中比它小的所有數(shù)字的數(shù)目,因此對于對于單個index上的數(shù)字data = nums[index],我們只需要統(tǒng)計桶數(shù)組bucket下標為data之前的數(shù)組數(shù)據(jù)之和。

    步驟4. 基于步驟三的操作,再次遍歷nums數(shù)組。

    int add_up_left(int num, int* bucket) {int numsout = 0;for (int i = 0; i < num; i++)numsout += bucket[i];return numsout; }int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {// 設置輸出數(shù)組,并初始化int *numsout = (int *)malloc(sizeof(int) * numsSize);memset(numsout, 0, numsSize * sizeof(int));int bucket_count[101] = {0}; // 桶計數(shù),桶計數(shù)數(shù)組下標是編號,比如說bucket_count[8]就代表數(shù)字8的數(shù)量.for (int i = 0; i < numsSize; i++) //記錄每個num[i]的數(shù)量bucket_count[nums[i]]++;for (int i = 0; i < numsSize; i++)numsout[i] = add_up_left(nums[i], bucket_count); //累計小于num[i]的所有數(shù)字數(shù)量*returnSize = numsSize;return numsout; } int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {// 設置輸出數(shù)組,并初始化int *numsout = (int *)malloc(sizeof(int) * numsSize);memset(numsout, 0, numsSize * sizeof(int));int bucket_count[101] = {0}; // 桶計數(shù),桶計數(shù)數(shù)組下標是編號,比如說bucket_count[8]就代表數(shù)字8的數(shù)量.for (int i = 0; i < numsSize; i++) //記錄每個num[i]的數(shù)量bucket_count[nums[i]]++;for (int i = 1; i < 101; i++) //將桶計數(shù)刷新成:累計小于等于num[i]的數(shù)字數(shù)量之和bucket_count[i] += bucket_count[i - 1];for (int i = 0; i < numsSize; i++) { //直接賦值if (nums[i] == 0)continue;elsenumsout[i] = bucket_count[nums[i] - 1];}*returnSize = numsSize;return numsout; }

    總結(jié)

    以上是生活随笔為你收集整理的【Leetcode1365】有多少小于当前数字的数字:详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。