地址:
力扣https://leetcode-cn.com/problems/create-target-array-in-the-given-order/
题目:
给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组:
目标数组 target 最初为空。
按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。
重复上一步,直到在 nums 和 index 中都没有要读取的元素。
请你返回目标数组。
题目保证数字插入位置总是存在。
示例 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 <= nums.length, index.length <= 100 nums.length == index.length 0 <= nums[i] <= 100 0 <= index[i] <= i |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/create-target-array-in-the-given-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
理论上如果 index 数组存放的指定位置是顺序的 0,1,2...arraySize
那么全部依次 target[i] = nums[i] 即可
可是,如果 index 指定位置发生了向前插入的话,那么就要特别处理
既然不能开辟空间,那么只能在target 数组上挪动
考虑示例:nums = [1,2,3,4,0], index = [0,1,2,3,0]
nums index 理论index target
0 0 0 [0]
1 1 1 [0,1]
2 2 2 [0,1,2]
3 2 3 [0,1,3,2]
4 1 4 [0,4,1,3,2]
第4次告知要插入nums[3] 元素到位置2,因为前面3次已经排序ok,位置2已经有值
理论位置应该是位置3,那么差 3-2=1,所以
1. 位置2要为nums 新值
2. 原有位置2以后的值全部往后挪 1 个位置
所以我们程序设计分为两种情况:
1. 理论 index 大于 index 数组内容值,那么需要挪动差值次;然后把新值放到 index 数组内容位置
2. 不用插入,新值放到 index 数组内容位置
方法一、元素插入移位
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){
int idx; // index's index
int i; // newArray's index
int j;
int *newArray = (int *)malloc(sizeof(int) * indexSize);
if(newArray == NULL)
return NULL;
for(i=0,idx=0; i<indexSize; i++,idx++)
{
if(idx > index[idx]) // do insert
{
int rang = idx-index[idx];
j=idx;
while(rang--)
{
newArray[j] = newArray[j-1];
j--;
}
newArray[j] = nums[i];
}
else
newArray[i] = nums[i];
}
*returnSize = indexSize;
return newArray;
}
结束语:
需要手动画图理解题意,并且找出如何进行数组元素插入的方法
下面是英雄哥的示例代码,解题思路有些不同,供参考:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){
int len = 0;
int i, j, ins, idx;
int *ret = (int *) malloc( sizeof(int) * numsSize );
for(i = 0; i < numsSize; ++i) {
idx = index[i];
ins = nums[i];
for(j = len; j > idx; --j) { // (1)
ret[j] = ret[j-1];
}
ret[idx] = ins; // (2)
++len; // (3)
}
*returnSize = len;
return ret;
}