Leedcode.12つの数値の合計

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; 
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_63742310/article/details/123889417