给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组:目标数组 target 最初为空。
按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。
重复上一步,直到在 nums 和 index 中都没有要读取的元素。
请你返回目标数组。
题目保证数字插入位置总是存在。
样例:
输入: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]
题目需要注意的点是;
- index[i]不能大于i;
- index[i]里面会有重复的,根据样例可以推出重复的那一项要从前面插入;
- ↑由(2)得知,再插入的时候我们需要把后面的数组依次后移,这样就要给malloc流出足够的空间
(即:(int*)target=(int*)malloc(sizeof(int)*(numSizes+1))
);
由以上分析我们可以知道,根据index[i]的重复与否我们可以分情况讨论:
- 当index[i]排列顺序为规律的[0,1,2,3,4,5]时;
- 当index[i]存在了重复,这个时候应该使用插入再赋值
代码示例:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){
*returnSize=numsSize;//这个要记住加上,在leetcode里必须出现
int i;
int *ret=(int *)malloc(sizeof(int)*(numsSize+1));
for(i=0;i<numsSize;i++){
if(i==index[i]){
ret[index[i]]=nums[i];
}else{
for(int j=i+1;j>index[i];j--){
ret[j]=ret[j-1];
}
ret[index[i]]=nums[i];
}
}
return ret;
}