【Leetcode1365】有多少小于当前数字的数字:详解
[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. 算法原理
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法检索文件服务器,无服务器快速无法检索
- 下一篇: 计算机辅助设计还需要手绘吗,西安电脑如此