持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
题目描述
1365. 有多少小于当前数字的数字 - 力扣(LeetCode)
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[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,还是按照双指针来解决。
- 首先就是对原数组的数字进行遍历
- 然后设置左指针和右指针,让它们以当前数为中心,向两边遍历,设置一个temp保留比当前数小的个数
- 对左指针的数和当前数做比较,小就话就temp++,更新left,右指针也一样,左右都遍历完后,把temp存入数组
- 所有数字都遍历完后,返回最终的结果
缺点:空间和时间的不是很优。
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;
}
};