【Java】力扣 - 刷题笔记 - 1389

【Java】力扣 - 刷题笔记 - 1389

  • 【Java】力扣 - 刷题笔记 - 1389
    • 题目介绍
    • 解题思路

【Java】力扣 - 刷题笔记 - 1389

每日一道题,提升一点点

题目介绍

1389. 按既定顺序创建目标数组
给你两个整数数组 numsindex。你需要按照以下规则创建目标数组:

目标数组 target 最初为空。
按从左到右的顺序依次读取 nums[i]index[i],在 target 数组中的下标 index[i] 处插入值 nums[i]
重复上一步,直到在 numsindex 中都没有要读取的元素。
请你返回目标数组。

题目保证数字插入位置总是存在。

示例 1:

输入:nums = [0,1,2,3,4], index = [0,1,2,2,1]
输出:[0,4,1,3,2]
解释:
nums       index     target
0            0        [0]
1            1        [0,1]
2            2        [0,1,2]
3            2        [0,1,3,2]
4            1        [0,4,1,3,2]

示例 2:

输入:nums = [1,2,3,4,0], index = [0,1,2,3,0]
输出:[0,1,2,3,4]
解释:
nums       index     target
1            0        [1]
2            1        [1,2]
3            2        [1,2,3]
4            3        [1,2,3,4]
0            0        [0,1,2,3,4]

示例 3:

输入:nums = [1], index = [0]
输出:[1]

提示:

  1. 1 <= nums.length, index.length <= 100
  2. nums.length == index.length
  3. 0 <= nums[i] <= 100
  4. 0 <= index[i] <= i

解题思路

1.题目分析

index       nums     target
0            0        [0]
1            1        [0,1]
2            2        [0,1,2]
2            3        [0,1,3,2]
1            4        [0,4,1,3,2]

我们拿上面的示例1来分析:

  1. 首先赋值插入索引index[0]=0位置值为nums[0]=0,即target[0]=0
  2. 再插入索引index[1]=1位置值为nums[1]=1,即target[1]=1
  3. 再插入索引index[2]=2位置值为nums[2]=2,即target[2]=2
  4. 再插入索引index[3]=2位置值为nums[3]=3,即target[2]=3,那么原target[2]=2的值后移,target[3]=2
  5. 再插入索引index[4]=1位置值为nums[4]=4,即target[1]=4,那么索引1,2,3的值后移;target[2]=1,target[3]=3,target[4]=2

我们再分析下target数组在内存中的处理过程,首先我们根据index和nums数组长度,得知target长度为5,则int[] target = new int[5];已知数组新建的默认值是0
【Java】力扣 - 刷题笔记 - 1389_第1张图片

第一步:target[0] = 0
【Java】力扣 - 刷题笔记 - 1389_第2张图片
第二步:target[1] = 1
【Java】力扣 - 刷题笔记 - 1389_第3张图片
第三步:target[2] = 2
【Java】力扣 - 刷题笔记 - 1389_第4张图片
第四步:target[2] = 3
【Java】力扣 - 刷题笔记 - 1389_第5张图片
第五步:target[1] = 4
【Java】力扣 - 刷题笔记 - 1389_第6张图片
我们可以发现 target 在 index[i] 处插入 nums[i] 时,相当于将 index[i] 及之后的值往后挪了一位,所以我们可以先写出这个功能来

public void moveBack(int[] a, int index) {
     
	// 数组 a 的 index 索引之后的值全部往后挪一位
	for (int i = a.length - 1; i > index; i--) {
     
		a[i] = a[i - 1]; 
	}
}

然后我们再在总的方法里调用这个 moveBack 函数将索引 index[i] 和之后的值往后移一位,之后将 nums[i] 赋值给 target[index[i]]

class Solution {
     
    public int[] createTargetArray(int[] nums, int[] index) {
     
    	// 根据 index 数组初始化 target 数组
        int[] target = new int[index.length];
        // 先将索引 index[i] 和之后的值往后移一位
        // 再给 target[index[i]] 赋值 nums[i]
        for (int i = 0; i < index.length; i++) {
     
            moveBack(target , index[i]);
            target[index[i]] = nums[i];
        }
        return target;
    }

    public void moveBack(int[] a, int index) {
     
    	// 数组 a 的 index 索引之后的值全部往后挪一位
        for (int i = a.length - 1; i > index; i--) {
     
            a[i] = a[i - 1]; 
        }
    }
}
  • 2.提交结果
    【Java】力扣 - 刷题笔记 - 1389_第7张图片

你可能感兴趣的