整数配列NUMSと目標値の目標を考えると、配列内の2つの整数の目標値を特定し、その配列の添字に戻るにお願いします。
あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
例:
所与のNUMS = [2、7、11、15]、目標= 9
NUMS [0] + NUMS [1ため ] = 2 + 7 = 9
返される[0,1]
小規模チョッパー
INT * twoSum(INT * NUMS、INT numsSize、INTターゲット、INT * returnSize){ int型私は、jは、 int型 NUM = 0 、NUM2。 int型 * arrayReturn = NULL; 用(i = 0 ; I <numsSize- 1 ; I ++ ){ ため(j = iは+ 1、J <numsSize; J ++ ){ 場合(NUMS [i]が+ NUMS [J] == ターゲット){ arrayReturn =(INT * )のrealloc(arrayReturn、sizeof(int型)*(2 + NUM)); NUM2 = 2 * NUM。 arrayReturn [NUM2] = I。 arrayReturn [NUM2 + 1 ] = J。 * returnSize = NUM2 + 2 。 NUM ++ ; } } } 戻りarrayReturnと、 }
時間のためのスペース
INT * twoSum(INT * NUMS、INT numsSize、INTターゲット、INT * returnSize){ INT *のRES =(INT *)はmalloc(はsizeof(INT)* 2 )。 以下のために(int型 i = 0 ; iはnumsSize- < 1 ; iは++ ){ ために(int型 J = iは+ 1、J <numsSize; J ++ ){ 場合(NUMS [i]が+ NUMS [J] == ターゲット){ RES [ 0 ] =私; RES [ 1 ] = J。 * returnSize = 2 。 リターンのres; } } } 戻りRES。 }
グレート神効率的なソリューション
/ * 簡単な方法* / INT * twoSum_basic(INT * NUMS、INT numsSize、INTターゲット、INT * returnSize){ * returnSize = 0 。 用(int型 iは= 0 ; iがnumsSizeを<I ++は{) のために(int型 J = I + 1、J <numsSize; J ++ ){ 場合(NUMS [I] + NUMS [J] == ターゲット){ INT * RET =(INT *)malloc関数(2 *のはsizeof(int型)); 場合(RET == NULL) 戻り値のNULLを。 * returnSize = 2 。 RET [ 0 ] = I。 RET [ 1 ] = jは、 リターンRET; } } } 戻りNULL。 } / * ハッシュマップ方式* / 構造体hash_data { int型のインデックス。 // int型のデータ。 }。 構造体hash_table { 構造体hash_dataの*の要素; const int型 * NUMS。 int型カウント; }。 int型するhash_init(構造体 hash_table *テーブル、INTの数){ 場合(カウント<= 0 ) リターン - 1 。 テーブル - >要素=(構造体 hash_data *)はmalloc(はsizeof(構造体 hash_data)* 数)。 もし(卓上>要素== NULL) リターン - 1 。 以下のための(int型I = 0 ; I <数えます。私は++ ){ テーブル - >要素[i]は.INDEX = - 1 。 // 卓上>要素[i]は.DATA = 0。 } テーブル - >カウント= カウント。 リターン 0 ; } ボイド hash_free(構造体 hash_table * テーブル){ 場合(!卓上>要素= NULL){ フリー(卓上> 要素)。 テーブル - >要素= NULL; } テーブル - >カウント= 0 ; } int型 hash_addr(INTデータ、int型TABLE_COUNT){ int型 ADDR =データ%のTABLE_COUNT。 リターン(ADDR> = 0)ADDR:(ADDR +?TABLE_COUNT)。 } ボイド hash_insert(構造体 hash_table *テーブル、int型データ、int型のインデックス){ int型 ADDR = hash_addr(データ、卓上> カウント) 一方、(卓上>要素[ADDR] .INDEX> = 0 ){ ADDR =(ADDR + 1)%卓上> カウント。 } テーブル - >要素[ADDR] .INDEX = 指数; //表:>要素[ADDR] .DATA =データ。 } 構造体 hash_data * hash_find(構造体 hash_table *テーブル、int型データ){ int型プライマリ。 int型のaddr =主= hash_addr(データ、テーブル- > 数); 実行{ 場合(卓上>要素[ADDR] .INDEX < 0 ) リターンNULL。 もし(卓上> NUMS [卓上>要素[ADDR] .INDEX] == データ){ リターン・卓上> 要素[ADDR]。 } ADDR =(ADDR + 1)%卓上> カウント。 }しばらく(!ADDR = プライマリ); リターンNULL; } / * * *注:返される配列は、mallocされなければならず、発信者が()無料通話と仮定する。 * / INT * twoSum(INT * NUMS、INT numsSize、INTターゲット、INT * returnSize){ INT * RET = NULL; int型のaddr; 構造体hash_tableテーブル。 構造体 hash_data * P_DATA。 もし(するhash_init(&テーブル、numsSize + numsSize / 5)< 0 ){ リターンtwoSum_basic(NUMS、numsSize、ターゲット、returnSize)。 }。 table.numsの =のNUMS。 * returnSize = 0 ; 以下のために(int型 i = 0 ; I <numsSize iは++ ){ 場合(!(P_DATA = hash_find(&表、ターゲットNUMS [I]))= NULL){ もし、((RET =(int型 *)のmalloc(2 * はsizeof(INT)))== NULL){ ブレーク。 } RET [ 0 ] = p_data-> インデックス。 RET [ 1 ] = I。 * returnSize = 2 。 リターンRET; } hash_insert( &テーブル、NUMS [i]は、I)。 } hash_free(および表)。 リターンNULL; }
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/two-sum