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

111 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

题目描述

1365. 有多少小于当前数字的数字 - 力扣(LeetCode)

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != inums[j] < nums[i] 。

以数组形式返回答案。

 

示例 1:

输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释: 
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。 
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。 
对于 nums[3]=2 存在一个比它小的数字:(1)。 
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

示例 2:

输入:nums = [6,5,4,8]
输出:[2,1,0,3]

示例 3:

输入:nums = [7,7,7,7]
输出:[0,0,0,0]

提示:

  • 2 <= nums.length <= 500
  • 0 <= nums[i] <= 100

思路分析

第一眼看到这个题目的时候,第一反应就是对这个数组进行排序,然后一遍遍历直接结束,但看到题中所给的返回结果,是有原始顺序的所以这个就直接out,还是按照双指针来解决。

  1. 首先就是对原数组的数字进行遍历
  2. 然后设置左指针和右指针,让它们以当前数为中心,向两边遍历,设置一个temp保留比当前数小的个数
  3. 对左指针的数和当前数做比较,小就话就temp++,更新left,右指针也一样,左右都遍历完后,把temp存入数组
  4. 所有数字都遍历完后,返回最终的结果

缺点:空间和时间的不是很优。

AC 代码

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        //本来想着用排序,这样更简单,但看了一下返回的答案是有顺序的
        //sort(nums.begin(),nums.end());
        
        vector<int> ans;//记录每次遍历后的比当前数大的结果
        for(int i=0;i<nums.size();i++){
            int temp=0;//保存比当前数小的数的个数
            int left=i-1;//当前数的左边的数
            int right=i+1;//当前数的右边的数
            //向左查找
            while(left>=0){
                //如果左边的数比当前数小,temp++
                if(nums[i]>nums[left]) temp++;
                //继续向左移动
                left--;
            }
            //向右查找
            while(right<nums.size()){
                //如果右边的数比当前数小,temp++
                if(nums[i]>nums[right]) temp++;
                //继续向右移动
                right++;
            }
            //把比当前数小的个数存入数组
            ans.push_back(temp);
        }
        //返回最后的结果
        return ans;        

    }
};