zoukankan      html  css  js  c++  java
  • LC1 两数之和

    代码如下:
     1 /**
     2  * Note: The returned array must be malloced, assume caller calls free().
     3  */
     4 int* twoSum(int* nums, int numsSize, int target) {
     5     static int a[2] = {0};
     6     
     7     for (int i = 0; i < numsSize; i++) {
     8         for (int j = i + 1; j < numsSize; j++) {
     9             if (nums[i] + nums[j] == target) {
    10                 a[0] = i;
    11                 a[1] = j;
    12                 return a;
    13             }
    14         }
    15     }
    16     return 0;
    17 }

    这道题简单,就不做过多解释。

    而另一种方法,则是用到基数排序

     1 /*************************************************************************
     2     > File Name: 1-1.cpp
     3     > Author: Mr.Lee
     4     > Mail: 18646139976@163.com
     5     > Created Time: 五  5/10 11:10:39 2019
     6  ************************************************************************/
     7 
     8 void radix_sort(int *arr, int *main_ind, int n) {
     9     #define MAX_N 65536
    10     #define MAX_M 32768
    11     #define L(x) (x & 0xffff)
    12     #define H(x) ((x >> 16) & 0xffff)
    13 
    14     int cnt[MAX_N] = {0}, *p;
    15     int *temp = (int *)malloc(sizeof(int) * n);
    16     int *ind = (int *)malloc(sizeof(int) * n);
    17     for (int i = 0; i < n; i++) cnt[L(arr[i])] += 1;
    18     for (int i = 1; i < MAX_N; i++) cnt[i] += cnt[i - 1];
    19     for (int i = n - 1; i >= 0; i--) {
    20         temp[--(cnt[L(arr[i])])] = arr[i];
    21         ind[cnt[L(arr[i])]] = i;
    22     }
    23     memset(cnt, 0, sizeof(cnt));
    24     for (int i = 0; i < n; i++) cnt[H(temp[i])] += 1;
    25     for (int i = MAX_M; i < MAX_M + MAX_N; i++) cnt[i % MAX_N] += cnt[(i - 1) % MAX_N];
    26     for (int i = n - 1; i >= 0; i--) {
    27         arr[--cnt[H(temp[i])]] = temp[i];
    28         main_ind[cnt[H(temp[i])]] = ind[i];
    29     }
    30     free(temp);
    31     free(ind);
    32     return;
    33 }
    34 
    35 
    36 
    37 int *twoSum(int *nums, int numsSize, int target, int *returnSize) {
    38     int *ind = (int *)malloc(sizeof(int) * numsSize);
    39     radix_sort(nums, ind, numsSize);
    40     int p = 0, q = numsSize - 1;
    41     while (nums[p] + nums[q] != target) {
    42         if (nums[p] + nums[q] > target) --q;
    43         else ++p;
    44     }
    45     int *ret = (int *)malloc(sizeof(int) * 2);
    46     ret[0] = ind[p];
    47     ret[1] = ind[q];
    48     if (ret[0] > ret[1]) {
    49         ret[0] ^= ret[1], ret[1] ^= ret[0], ret[0] ^= ret[1];
    50     }
    51     free(ind);
    52     returnSize[0] = 2;
    53     return ret;
    54 }

    还有一种方法,则是哈希表

    /*************************************************************************
        > File Name: 1-2.cpp
        > Author: Mr.Lee
        > Mail: 18646139976@163.com
        > Created Time: 五  5/10 11:30:27 2019
     ************************************************************************/
    
    typedef struct Data {
        int val, ind;
    }
    
    typedef struct HashTable {
        Data *data;
        int *flag;
        int size;
    } HashTable;
    
    HashTable *init(int n) {
        HashTable *h = (HashTable *)malloc(sizeof(HashTable));
        h->data = (Data *)malloc(sizeof(Data) * n);
        h->flag = (int *)calloc(sizeof(int), (n / 32 + 1) );
        h->size = n;
        return h;
    }
    
    int hash(int val) {
        return val & 0x7fffffff;
    }
    
    int check(HashTable *h, int ind) {
        int x = ind / 32, y = ind % 32;
        return (h->flag[x] & (1LL << y)) != 0;
    }
    
    void set(HashTable *h, int ind, Data d) {
        int x = ind / 32, y = ind % 32;
        h->data[ind] = d;
        h->flag[x] |= (1LL << y);
        return;
    }
    
    void insert(HashTable *h, int ind, Data d) {
        Data d = {val, val_ind};
        int ind = hash(val) % h->size;
        int time = 1;
        while (check(h, ind)) {
            ind += (time * time);
            ind %= h->size;
        }
        set(h, ind, d);
        return;
    }
    
    int query(HashTable *h, int val) {
        int ind = hash(val) % h->size;
        int time = 1;
        while (check(h, ind) && h->data[ind].val != val) {
            ind += (time * time);
            ind %= h->size;
        }
        if (check(h, ind)) return h->data[ind].ind;
        return -1;
    }
    
    void clear(HashTable *h) {
        if (h == NULL) return;
        free(h->data);
        free(h->flag);
        free(h);
        return;
    }
    
    int *twoSum(int *nums, int numsSize, int target, int *returnSize) {
        HashTable *h = init(numsSize * 3);
        int *ret = (int *)malloc(sizeof(int) * 2);
        for (int i = 0, ind; i < numsSize; i++) {
            if ((ind = query(h, target - nums[i])) == -1) {
                insert(h, nums[i], i);
                continue;
            }
            ret[0] = ind;
            ret[1] = i;
            break;
        }
        returnSize[0] = 2;
        return ret;
    }
  • 相关阅读:
    asp.net 使用urlrewrite之后的form postback
    WebService来获取Context.User.Identity.Name为空的问题?
    求救:C#的一个绘图问题
    flex 使用webservice的域访问问题
    请教大家一个问题,有关于数据库的设计
    C# 中使用结构体
    Discuz Nt 3.0开启Memcached 以及二次开发监控Memcached状态
    Flex 中对xml数据的处理
    Oracle alert log 按天 存放 脚本
    Asktom Oracle:On Caching and Evangelizing SQL
  • 原文地址:https://www.cnblogs.com/lihanwen/p/10501743.html
Copyright © 2011-2022 走看看