2つの数の合計1 leetcodeアルゴリズム

整数配列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、sizeofint型)*(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はsizeofINT)* 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 *のはsizeofint型));
                場合(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型 *)のmalloc2 * はsizeofINT)))== 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

おすすめ

転載: www.cnblogs.com/still-smile/p/11537516.html