这道题的要求是先让我们先对数组进行升序排序,然后将数组下标小于target元素所在下表的所有数重新归入输出的数组中,最后输出这个数组。
方法一:sort+ans.push_back()
时间复杂度:O(),n为nums的长度,排序的时间复杂度占主体。
空间复杂度:O(),即为排序的栈空间开销。
class Solution {
public:
vector<int> targetIndices(vector<int>& nums, int target) {
int n=nums.size();
sort(nums.begin(),nums.end());
vector<int> ans;
for(int i=0;i<n;i++){
if(nums[i]==target){
ans.push_back(i);
}
}
return ans;
}
};
方法二:直接统计数量(竟然不需要nlogn的排序!)
方法简介:举例:输入数组nums=[1,2,4,3,3,5],target=3,先设置一个答案数组ans和两个初始值为0的变量cnt1,cnt2。cnt1记录nums[i]<target的数量,cnt2记录nums[i]==target的数量,那么ans需要push_back的元素就是从cnt1到cnt1+cnt2这一段。
class Solution {
public:
vector<int> targetIndices(vector<int>& nums, int target) {
int cnt1 = 0; //小于 target 的元素数量
int cnt2 = 0; //等于 target 的元素数量
for (const int num: nums){
if (num < target){
++cnt1;
}
else if (num == target){
++cnt2;
}
}
vector<int> ans; //下标数组
for (int i = cnt1; i < cnt1 + cnt2; ++i){
ans.push_back(i);
}
return ans;
}
};