【算法】2089. 找出数组排序后的目标下标(多语言实现)

简介: 给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target 。目标下标 是一个满足 nums[i] == target 的下标 i 。将 nums 按 非递减 顺序排序后,返回由 nums 中目标下标组成的列表。如果不存在目标下标,返回一个 空 列表。返回的列表必须按 递增 顺序排列。

2089. 找出数组排序后的目标下标:

给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target

目标下标 是一个满足 nums[i] == target 的下标 i

nums非递减 顺序排序后,返回由 nums 中目标下标组成的列表。如果不存在目标下标,返回一个 列表。返回的列表必须按 递增 顺序排列。

样例 1:

输入:
    nums = [1,2,5,2,3], target = 2
    
输出:
    [1,2]
    
解释:
    排序后,nums 变为 [1,2,2,3,5] 。
    满足 nums[i] == 2 的下标是 1 和 2 。

样例 2:

输入:
    nums = [1,2,5,2,3], target = 3
    
输出:
    [3]
    
解释:
    排序后,nums 变为 [1,2,2,3,5] 。
    满足 nums[i] == 3 的下标是 3 。

样例 3:

输入:
    nums = [1,2,5,2,3], target = 5
    
输出:
    [4]
    
解释:
    排序后,nums 变为 [1,2,2,3,5] 。
    满足 nums[i] == 5 的下标是 4 。

样例 4:

输入:
    nums = [1,2,5,2,3], target = 4
    
输出:
    []
    
解释:
    nums 中不含值为 4 的元素。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i], target <= 100

分析

  • 这道算法题实现起来不难。
  • 至少我们可以按着题意,先对数组排序,然后再遍历排序后的数组。这样的时间复杂度是O(nlogn),主要是排序花时间比较多。
  • 是否可以优化呢?
  • 是不是一定要排序呢?
  • 根据题意,我们需要知道包含几个目标数字,有几个目标数字就需要返回几个数字的下标。
  • 排序后,相同数字一定是连续挨着的,所以返回结果要么为空,要么是连续的。
  • 那么我们其实仅需要知道有几个目标数字,和第一个目标数字应该放在哪个位置。
  • 目标数字排序后放在哪个位置,仅仅需要关心它前面有几个数字,而并不需要前面的数字有序,有点像快速排序的思想。
  • 这样我们就仅需要一次遍历,来统计目标数字有几个,以及比目标数字小的数字有几个就可以了,时间复杂度降为O(n)。

题解

java

class Solution {
    public List<Integer> targetIndices(int[] nums, int target) {
        int lessCount = 0;
        int count     = 0;

        for (int num : nums) {
            if (num == target) {
                ++count;
            } else if (num < target) {
                ++lessCount;
            }
        }

        List<Integer> ans = new ArrayList<>(count);
        for (int i = lessCount; i < lessCount + count; ++i) {
            ans.add(i);
        }
        
        return ans;
    }
}

c

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* targetIndices(int* nums, int numsSize, int target, int* returnSize){
    int less_count = 0;
    *returnSize = 0;
    for (int i = 0; i < numsSize; ++i) {
        if (nums[i] == target) {
            ++(*returnSize);
        } else if (nums[i] < target) {
            ++less_count;
        }
    }

    int *ans = malloc(*returnSize * sizeof(*ans));
    for (int i = 0; i < (*returnSize); ++i) {
        ans[i] = less_count + i;
    }

    return ans;
}

c++

class Solution {
public:
    vector<int> targetIndices(vector<int>& nums, int target) {
        int lessCount = 0;
        int count = 0;
        for (const int& num : nums) {
            if (num == target) {
                ++count;
            } else if (num < target) {
                ++lessCount;
            }
        }

        vector<int> ans;
        for (int i = lessCount; i < lessCount + count; ++i) {
            ans.push_back(i);
        }

        return ans;
    }
};

python

class Solution:
    def targetIndices(self, nums: List[int], target: int) -> List[int]:
        less_count = 0
        count = 0
        for num in nums:
            if num == target:
                count += 1
            elif num < target:
                less_count += 1
        ans = []
        for i in range(less_count, less_count + count):
            ans.append(i)
        return ans
        

go

func targetIndices(nums []int, target int) []int {
    lessCount := 0
    count := 0
    for _, num := range nums {
        if num == target {
            count++
        } else if num < target {
            lessCount++
        }
    }

    ans := make([]int, count)
    for i := 0; i < count; i++ {
        ans[i] = i + lessCount
    }

    return ans
}

rust

impl Solution {
    pub fn target_indices(nums: Vec<i32>, target: i32) -> Vec<i32> {
        let mut less_count = 0;
        let mut count = 0;
        nums.iter().for_each(|num| {
            if *num == target {
                count += 1;
            } else if *num < target {
                less_count += 1;
            }
        });
        (less_count..less_count + count).collect()
    }
}

在这里插入图片描述


原题传送门:https://leetcode-cn.com/problems/find-target-indices-after-sorting-array/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~

相关文章
|
3月前
|
自然语言处理 Rust 算法
【算法】17. 电话号码的字母组合(多语言实现)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
【算法】17. 电话号码的字母组合(多语言实现)
|
2月前
|
机器学习/深度学习 监控 算法
R-CNN系列目标算法
8月更文挑战第12天
|
2月前
|
算法
【算法】前缀和——寻找数组的中心下标
【算法】前缀和——寻找数组的中心下标
|
3月前
|
机器学习/深度学习 人工智能 分布式计算
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
机器学习中的超参数调优是提升模型性能的关键步骤,包括网格搜索、随机搜索、贝叶斯优化和遗传算法等方法。网格搜索通过穷举所有可能的超参数组合找到最优,但计算成本高;随机搜索则在预设范围内随机采样,降低计算成本;贝叶斯优化使用代理模型智能选择超参数,效率高且适应性强;遗传算法模拟生物进化,全局搜索能力强。此外,还有多目标优化、异步并行优化等高级技术,以及Hyperopt、Optuna等优化库来提升调优效率。实践中,应结合模型类型、数据规模和计算资源选择合适的调优策略。
131 0
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
|
4月前
|
算法 自然语言处理 Rust
【算法】16. 最接近的三数之和(多语言实现)
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。
|
4月前
|
算法 调度
【完全复现】基于改进粒子群算法的微电网多目标优化调度
该文档描述了一个使用改进粒子群算法实现的微电网多目标优化调度的Matlab程序。该模型旨在最小化运行成本和环境保护成本,将多目标问题通过权值转换为单目标问题解决。程序中定义了决策变量,如柴油发电机、微型燃气轮机、联络线和储能的输出,并使用全局变量处理电负荷、风力和光伏功率等数据。算法参数包括最大迭代次数和种群大小。代码调用了`PSOFUN`函数来执行优化计算,并展示了优化结果的图表。
|
5月前
|
算法
【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品
【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品
|
5月前
|
算法 调度
基于多目标粒子群算法的微电网优化调度-王金全
基于多目标粒子群算法的微电网优化调度-王金全
|
4月前
|
算法 Java Go
【经典算法】LeetCode28 找出字符串中第一个匹配项的下标(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode28 找出字符串中第一个匹配项的下标(Java/C/Python3实现含注释说明,Easy)
35 0
|
5月前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)