C データ構造とアルゴリズム — ターゲットの合計を見つけるための配列フェッチ

目次

記事ディレクトリ

トピック

整数配列 nums と整数ターゲット値 target が与えられた場合、その合計が配列内のターゲット値 target である 2 つの整数を見つけて、それらの配列添字を返します。

#include <stdio.h>
#include <stdlib.h>

int *two_sum(int *nums, int nums_size, int target) {
    
    
    // 哈希表,用于存储整数和下标
    int hash[10000] = {
    
    0};
    // 结果数组,存放两个整数的下标
    static int result[2];

    for(int i = 0; i < nums_size; i++) {
    
    
        // 取目标值和当前整数的差值
        int complement = target - nums[i];

        // 如果差值不在 hash 中,则添加,key 为 整数,value 为 idx+1(避免出现为 0 的情况)。
        if (0 == hash[complement]) {
    
    
            hash[nums[i]] = i + 1;
        } else {
    
    
            // 如果差值存在 hash 中,则直接取出整数的 idx-1(因为存的时候 +1 了)。
            result[0] = hash[complement] - 1;
            // 另外一个 idx 就是当前整数。
            result[1] = i;
            return result;
        }
    }
    return NULL;
}

int main() {
    
    
    int nums[] = {
    
    1, 2, 3, 4, 5};  // 随机数组
    int nums_size = 5;             // 数组长度
    int target = 6;                // 目标和

    int *result = two_sum(nums, nums_size, target);
    if (NULL == result) {
    
    
        printf("No result found!\n");
    } else {
    
    
        printf("result index: [%d, %d]\n", result[0], result[1]);
    }
}
  • 時間計算量はO(n) で、n 個の要素を含む配列は 1 回だけトラバースされ、ハッシュ テーブル内の各ルックアップには O(1) 時間しかかかりません。
  • スペースの複雑さは: O(n) です。必要なメモリ スペースは、ハッシュ テーブルに格納されている要素の数に依存し、テーブルには最大で n 個の要素を格納する必要があります。

おすすめ

転載: blog.csdn.net/Jmilk/article/details/130139820