【算法】1920. 基于排列构建数组(java / c / c++ / python / go / rust)

简介: 给你一个 从 0 开始的排列 nums(下标也从 0 开始)。请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans 。从 0 开始的排列 nums 是一个由 0 到 nums.length - 1(0 和 nums.length - 1 也包含在内)的不同整数组成的数组。

1920. 基于排列构建数组:

给你一个 从 0 开始的排列 nums(下标也从 0 开始)。请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans 。

从 0 开始的排列 nums 是一个由 0 到 nums.length - 1(0 和 nums.length - 1 也包含在内)的不同整数组成的数组。

样例 1:

 输入:
     nums = [0,2,1,5,3,4]
输出:
    [0,1,2,4,5,3]
解释:
    数组 ans 构建如下:
    ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
        = [nums[0], nums[2], nums[1], nums[5], nums[3], nums[4]]
        = [0,1,2,4,5,3]

样例 2:

输入:
    nums = [5,0,1,2,3,4]
输出:
    [4,5,0,1,2,3]
解释:
    数组 ans 构建如下:
    ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
        = [nums[5], nums[0], nums[1], nums[2], nums[3], nums[4]]
        = [4,5,0,1,2,3]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] < nums.length
  • nums 中的元素 互不相同

分析

题目描述既是答案,直接新建一个同样大小的数组,遍历一遍,按顺序赋值即可。

但是这样需要占更多内容空间,而且单纯这样做,根本算不上算法吧?

怎样能做到不占用新的内存空间呢?提示中,每个数的范围都在[0,999]之间,这是个关键。


题解

java

按照题意的直接处理法

class Solution {
    public int[] buildArray(int[] nums) {
        final int n = nums.length;
        
        int[] ans = new int[n];
        
        for (int i = 0; i < n; ++i) {
            ans[i] = nums[nums[i]];
        }
        
        return ans;
    }
}

不开辟新的空间,直接在原数组处理

class Solution {
    public int[] buildArray(int[] nums) {
        final int n         = nums.length;
        final int highValue = 1000;

        // 将结果值附加到数组
        for (int i = 0; i < n; ++i) {
            // 将原值+结果
            // 一个值同时存储了原值和结果值
            nums[i] += highValue * (nums[nums[i]] % highValue);
        }

        // 将原值剔除,仅保留结果
        for (int i = 0; i < n; ++i) {
            nums[i] /= highValue;
        }

        return nums;
    }
}

c

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* buildArray(int* nums, int numsSize, int* returnSize){
    const int highValue = 1000;

    for (int i = 0; i < numsSize; ++i) {
        nums[i] += highValue * (nums[nums[i]] % highValue);
    }

    for (int i = 0; i < numsSize; ++i) {
        nums[i] /= highValue;
    }

    *returnSize = numsSize;

    return nums;
}

c++

class Solution {
public:
    vector<int> buildArray(vector<int>& nums) {
        const int highValue = 1000;
        int n = nums.size();

        for (int i = 0; i < n; ++i) {
            nums[i] += highValue * (nums[nums[i]] % highValue);
        }
        
        for (int i = 0; i < n; ++i) {
            nums[i] /= highValue;
        }

        return nums;
    }
};

python

from typing import List

class Solution:
    def buildArray(self, nums: List[int]) -> List[int]:
        highValue = 1000
        n = len(nums)
        for i in range(n):
            nums[i] += highValue * (nums[nums[i]] % highValue)
        for i in range(n):
            nums[i] //= highValue
        return nums

go

func buildArray(nums []int) []int {
    highValue := 1000
    n := len(nums)

    for i := 0; i < n; i++ {
        nums[i] += highValue * (nums[nums[i]] % highValue)
    }

    for i := 0; i < n; i++ {
        nums[i] /= highValue
    }

    return nums;
}

rust

impl Solution {
    pub fn build_array(nums: Vec<i32>) -> Vec<i32> {
        let mut nums = nums;
        
        let high_value = 1000;
        let n = nums.len();
        
        for i in 0..n {
            nums[i] += high_value * (nums[nums[i] as usize] % high_value);
        }

        for i in 0..n {
            nums[i] /= high_value;
        }

        return nums;
    }
}

原题传送门:https://leetcode-cn.com/problems/build-array-from-permutation/


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

相关文章
|
2月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
3月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
200 26
|
3月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
782 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
347 4
|
3月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
202 0
|
3月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
246 0
|
存储 算法 Java
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
275 0
|
存储 算法 Java
数据结构算法学习打卡week2 (Java)
数据结构算法学习打卡week2 (Java)
203 0
|
Rust 算法 安全
【算法学习】1588. 所有奇数长度子数组的和(java / c / c++ / python / go / rust)
给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。 子数组 定义为原数组中的一个连续子序列。 请你返回 arr 中 所有奇数长度子数组的和 。
【算法学习】1588. 所有奇数长度子数组的和(java / c / c++ / python / go / rust)

热门文章

最新文章