LeetCode算法练习day2
(每日一图)
话不多说,直接上题:
基于排列构建数组
给你一个 从 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 也包含在内)的不同整数组成的数组。
示例:
输入: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]
思路分析
单看题目描述,这题他丫的说的啥。
然后呢,看了示例,再返回去看题,这不就是把组内元素当下标重新赋值给一个数组吗?不愧是全站通过率最高的一道题。
Java 解法
public class day2 {
public int[] buildArray(int[] nums) {
int[] ans =new int[nums.length];
for(int i=0;i<nums.length;i++){
ans[i]=nums[nums[i]];
}
return ans;
}
}
当然结果是不出意料的通过了…
啊哈,总感觉有点被骗了的感觉,所以我找到内存第一的那哥们,看看我差在哪了。
多了一行代码:System.gc();
也就是一个垃圾收集器,减小了内存的占用。
然后我也试了一下:
嗯,非常nice,这个数据一看就很有成就感。
鉴于这道题有些过于简单,所以我再增加一个Python解法(为了这篇博客不是那么空洞)
Python3 解法
由于我本身对于Python学习的并不是很熟练(局限于某一个库的使用)所以代码可能比较冗杂。
class Solution:
def buildArray(self, nums: List[int]) -> List[int]:
ans = []
for i in range(len(nums)):
ans.append(nums[nums[i]])
return ans
没什么难度,所以今天就先结束了
最后附上一个我觉得很简洁的代码
def buildArray(self, nums: List[int]) -> List[int]:
return [nums[nums[i]] for i in range(len(nums))]
一句就完成了,但是有那么一点慢:
问题不大,明天整理一下哈希算法相关知识,以后周一到周五日常练题,周六周日总结。