---
# System prepended metadata

title: Leetcode 1. Two Sum 筆記
tags: [LeetCode]

---

# Leetcode 1. Two Sum 筆記
## 暴力解
一般最直覺可以想到的方式，題目有規定要使用動態記憶體配置，所以這邊使用malloc來製作，C語言中動態記憶體配置有關的函數有malloc、calloc、realloc、free。

當程式需要使用到大量記憶體的時候就必須宣告它，例如你不知道可能要用到多大空間的array這時候宣告它就不會導致切一大塊記憶體卻沒有用到，造成演算法效能低落。

> malloc全名memory allocation，配置size bytes 的記憶體區塊，會回傳一個指向該記憶體開頭的指標
> calloc全名contiguous allocation，配置array用，一樣回傳一個指向該記憶體開頭的指標
> realoc就用來改變空間大小
> free非常重要，要用來釋放空間

[動態記憶體的相關測試](https://morosedog.gitlab.io/C-20191024-C-20/)
[微軟官方文件](https://docs.microsoft.com/zh-tw/cpp/c-runtime-library/reference/malloc?view=msvc-170)

```c=
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i=0,j=0;
    *returnSize = 2;
    int* result=NULL;
    for(i=0;i<numsSize;i++){
        for(j=i+1;j<numsSize;j++){
            if(target==nums[i]+nums[j]){
                result = (int*)malloc(sizeof(int)*2);
                result[0]=i;
                result[1]=j;
            }
        }
    }
    return result;
}
```
執行時間200ms，大小6.5MB
## HashTable
以key-value方式表示，透過下圖可以看到為一種mapping關係，如果今天將n個數字先儲存在hash table中，要判斷數字是否有沒有在Hash Table裡，只要通過hash function就可以快速獲得數字是否有儲存，但要注意value值是否夠用，如果key太多就會有多個指到同個value的問題。

![](https://i.imgur.com/bEIJdv2.png)

稍微介紹一下三元運算子
```
A?B:C 若A為真，則B，若A為否，則C
```
這題解法當迴圈跑到nums[i]時，如果 target-nums[i]還不在 Hash Table中，那就儲存(nums[i], i)，這樣就完成這題的演算法了
```c=
#define SIZE 30000 //這數字能跑過

int hashtable(int key)//建立hashtable
{
    int r = key % SIZE;
    return r < 0 ? r + SIZE : r;//hash function
}

void insert(int *keys, int *values, int key, int value)//插值
{
    int index = hashtable(key);

    while (values[index])
    {
        index = (index + 1) % SIZE;
    }

    keys[index] = key;
    values[index] = value;
}

int search(int *keys, int *values, int key)//進行搜尋
{
    int index = hashtable(key);

    while (values[index])
    {
        if (keys[index] == key)
        {
            return values[index];
        }

        index = (index + 1) % SIZE;
    }

    return 0;
}
int *twoSum(int *nums, int numsSize, int target, int *returnSize)
{
    *returnSize = 2;
    int keys[SIZE];
    int values[SIZE] = {0};

    for (int i = 0; i < numsSize; i++)
    {
        int complements = target - nums[i];
        int value = search(keys, values, complements);

        if (value)
        {
            int *result = (int *)malloc(sizeof(int) * 2);
            result[0] = value - 1;
            result[1] = i;
            return result;
        }

        insert(keys, values, nums[i], i + 1);
    }

    return NULL;
}
```
執行時間15ms，6.3MB

###### tags: `LeetCode`