1. 2つの数値の合計
整数配列numsと整数ターゲット値ターゲットが与えられた場合、合計が配列内のターゲット値ターゲットである2つの整数を見つけて、それらの配列添え字を返します。入力ごとに1つの答えしかないと想定できます。ただし、配列内の同じ要素を回答で繰り返すことはできません。
回答は任意の順序で返すことができます。
例1:
入力:nums = [2,7,11,15]、ターゲット= 9
出力:[0,1]説明:
nums [0] + nums [1] == 9であるため、[0、1]を返します。
例2:
入力:nums = [3,2,4]、ターゲット= 6出力:[1,2]
例3:
入力:nums = [3,3]、ターゲット= 6出力:[0,1]
*方法1:ブルートフォースの列挙
アイデア:
配列の最初の数値をXに設定し、配列をトラバースしてtarget-Xを見つけます。
見つからない場合は、2番目の番号を使用して、操作を繰り返します。
配列自体は変更されていないため、Xとtarget-Xのインデックスを変数に格納して戻ります。
コード:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
/*从第一个数字开始*/
for (int i = 0 ; i<numsSize-1 ; i++)
{
/*和后一个比较*/
for(int j = i+1 ; j <numsSize ;j++)
{
/*如果满足条件,返回*/
if (nums[i]+nums[j]==target)
{
int *array = (int*)malloc(2*sizeof(int));
array[0] = i;
array[1] = j;
*returnSize = 2;
return array;
}
}
}
return 0;
}
方法2:ダブルポインター
アイデア:
配列の要素は順序が狂っているので、最初に昇順で並べ替えることができます。次に、ダブルポインタ方式を使用してトラバースします。左のポインタに対応する値と右のポインタに対応する値がSum
であることに注意してください。
Sum <targetの場合、左のポインターは右に移動します。
Sum <targetの場合、右のポインターを左に移動します
トラバースすることでこれらの2つの数値を見つけることができますが、どのようにしてそれらの添え字を返すのでしょうか。
数値と添え字の両方を格納できるデータ型は何ですか?
はい、それは構造です。
左右のポインタからターゲットの値と添え字を見つけます。
typedef struct data
{
int value; //value数组元素的数值
int index; //数组下标
}data;
int cmp(const void* e1,const void * e2)//排序函数
{
data* pa = (data*)e1;
data* pb = (data*)e2;
return pa->value >pb->value;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
data* array = (data*)malloc(numsSize*sizeof(data));
for(int i = 0 ;i < numsSize ; i++)//copy一个数组
{
array[i].value = nums[i];
array[i].index = i;
}
qsort (array, numsSize, sizeof(data),cmp);//快速排序
int left = 0;
int right = numsSize-1;
int *ret=(int*)malloc(sizeof(int)*2);
while (left<right)
{
if(array[left].value+array[right].value<target)
{
left++;
}
else if(array[left].value+array[right].value>target)
{
right--;
}
else
{
ret[0] = array[left].index;
ret[1] = array[right].index;
break;
}
}
*returnSize=2; //返回的数组大小为2
return ret;
}