【C++ LC.2089 找出数组排序后的目标下标】
/* 给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。
目标下标 是一个满足?nums[i] == target 的下标 i 。
将 nums 按 非递减 顺序排序后,返回由 nums 中目标下标组成的列表。
如果不存在目标下标,返回一个 空 列表。返回的列表必须按 递增 顺序排列。
示例:
输入:nums = [1,2,5,2,3], target = 2
输出:[1,2]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 2 的下标是 1 和 2 。
来源:力扣(LeetCode) */
//法一 先排序再全部遍历一遍
class Solution{
public:
vector<int> targetIndices(vector<int>& nums,int target){
int n=nums.size();
sort(nums.begin(),nums.end()); //从小到大排序
vector<int> result;
for(int i=0;i<n;i++){
if(nums[i]==target){
result.push_back(i);
}
}
return result;
}
};
//法二
class Solution {
public:
vector<int> targetIndices(vector<int>& nums, int target) {
int n=nums.size();
for(int i=0;i<n-1;i++){ //冒泡排序法,背!!!
for(int j=0;j<n-1-i;j++){
if(nums[j]>nums[j+1]){
int p;
p=nums[j];
nums[j]=nums[j+1];
nums[j+1]=p;
}
}
}
vector<int> result;
for(int i=0;i<n;i++){
if(nums[i]==target){
result.push_back(i);
}
}
return result;
}
};
//法三
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++;
}
if(num==target){
cnt2++;
}
}
/* 相当于用迭代器遍历容器
for (vector<int>::iterator iter=nums.begin();iter!=nums.end();iter++)
*/
vector<int> result; //输出下标数组
for(int i=cnt1;i<cnt1+cnt2;i++){ //排序后的数组相等的值对应的下标一定是连在一起的
result.push_back(i);
}
return result;
}
};