【Leetcode1365】有多少小于当前数字的数字:详解
生活随笔
收集整理的這篇文章主要介紹了
【Leetcode1365】有多少小于当前数字的数字:详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[Leetcode1365] 有多少小于當前數字的數字
1. 題目
給你一個數組 nums,對于其中每個元素 nums[i],請你統計數組中比它小的所有數字的數目。
換而言之,對于每個 nums[i] 你必須計算出有效的 j 的數量,其中 j 滿足 j != i 且 nums[j] < nums[i] 。
以數組形式返回答案。
2. 算法原理
3. 暴力遍歷
從題干分析需求,
步驟1. 對于單個index上的數字nums[index],都需要遍歷一遍整個數組nums統計有多少數據比nums[index]小。
步驟2. 而統計完整個數組nums,需要完成數組長度numsSize次循環。
因此采用雙重循環暴力遍歷就可以得到結果。
// 分析結構 // input @ int *nums 輸入數組指針 // @ int numsSize 輸入數組長度 // output @ int *returnSize 輸出數組長度 // return @ int * 輸出數組指針 int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize){// 設置輸出數組,并初始化int *numsout = (int *)malloc(sizeof(int) * numsSize);memset(numsout, 0, numsSize *sizeof(int));int i, j;for (i = 0; i < numsSize; i++) { //外循環,按順序依次選定一個nums[i]for (j = 0; j < numsSize; j++) { // 遍歷一次數組,遇到nums[j] < nums[i]時,統計數組cal_less[i]對應位置加1if (nums[j] < nums[i]) {numsout[i]++;}}}// 輸出結果*returnSize = numsSize;return numsout; }4. 桶計數
從題干分析需求,(在數組值較小時,(0 < nums[i] < 100),可以使用桶計數 )
步驟1. 建立桶數組,桶數組的下標對應著nums的數據取值范圍(本文是0 - 100),初始化為0。
步驟2. 單次遍歷nums數組,桶數組記錄每個數據出現的頻數。
步驟3. 題干要求統計數組中比它小的所有數字的數目,因此對于對于單個index上的數字data = nums[index],我們只需要統計桶數組bucket下標為data之前的數組數據之和。
步驟4. 基于步驟三的操作,再次遍歷nums數組。
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) {// 設置輸出數組,并初始化int *numsout = (int *)malloc(sizeof(int) * numsSize);memset(numsout, 0, numsSize * sizeof(int));int bucket_count[101] = {0}; // 桶計數,桶計數數組下標是編號,比如說bucket_count[8]就代表數字8的數量.for (int i = 0; i < numsSize; i++) //記錄每個num[i]的數量bucket_count[nums[i]]++;for (int i = 0; i < numsSize; i++)numsout[i] = add_up_left(nums[i], bucket_count); //累計小于num[i]的所有數字數量*returnSize = numsSize;return numsout; } int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize) {// 設置輸出數組,并初始化int *numsout = (int *)malloc(sizeof(int) * numsSize);memset(numsout, 0, numsSize * sizeof(int));int bucket_count[101] = {0}; // 桶計數,桶計數數組下標是編號,比如說bucket_count[8]就代表數字8的數量.for (int i = 0; i < numsSize; i++) //記錄每個num[i]的數量bucket_count[nums[i]]++;for (int i = 1; i < 101; i++) //將桶計數刷新成:累計小于等于num[i]的數字數量之和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; }總結
以上是生活随笔為你收集整理的【Leetcode1365】有多少小于当前数字的数字:详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法检索文件服务器,无服务器快速无法检索
- 下一篇: 计算机辅助设计还需要手绘吗,西安电脑如此