码迷,mamicode.com
首页 > 其他好文 > 详细

[Leetcode]-Contains Duplicate HashTbale重解

时间:2015-07-07 22:49:52      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:leetcode

Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.

Hide Tags: Array, Hash Table
题目:输入int型数组,检测其中是否有重复的元素,如果有重复的元素则反复true,否则返回false
解法一:暴力求解,两层for循环,1600ms

//暴力求解
bool containsDuplicate(int* nums, int numsSize) {
    int i = 0,j=0;
    for(i=0;i<numsSize;i++)
    {
        for(j=i+1;j<numsSize;j++)
            if(nums[i] == nums[j])
                return true;
    }
    return false;
}

解法二:hashTable解法16ms

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
//hashtable
typedef int ElementType;

//hashtable
typedef unsigned int index1;
typedef struct listnode* position;
typedef struct listnode* list;
struct listnode{
    ElementType data;
    position next;
};

typedef struct hashtbl*  hashtable;
struct hashtbl {
    int tablesize;
    list *thelists;
};

index1 HashFunc(const ElementType key,int tablesize)
{
    //unsigned int hashval = 0;
    //while(*key != ‘\0‘)   
        //hashval = (hashval << 5) + *key++;
    //return hashval % tablesize;

    int index = key % tablesize;
    return  index = index >= 0? index: index+tablesize;
}

hashtable InitializeHashTable(int tablesize)
{
    hashtable H;
    H = (hashtable)malloc(sizeof(hashtable));
    if(NULL == H) return NULL;

    H->tablesize = tablesize;

    H->thelists = (list*)malloc(sizeof(list) * H->tablesize);
    int i = 0;
    for(i=0;i<H->tablesize;i++)//有表头
    {
        H->thelists[i] = (list)malloc(sizeof(struct listnode));
        H->thelists[i]->next = NULL;
    }
    return H;
}
void DeleteHashTable(hashtable H)
{
    position P,tem;
    int i = 0;
    for(i=0;i<H->tablesize;i++)
    {
        P = H->thelists[i]->next;
        while(P != NULL)
        {
            tem = P;
            free(tem);
            P=P->next;
        }
    }
    free(H->thelists);
    free(H);
}
position Find(ElementType key,hashtable H)
{
    position P;
    list L;
    L = H->thelists[ HashFunc( key, H->tablesize) ];
    P = L->next;
    while(P != NULL && P->data != key)
        P = P->next;

    return P;
}

bool Insert(ElementType key,hashtable H)
{
    position pos,newnode;
    list L;
    pos = Find(key,H);
    if(pos == NULL)
    {
        newnode = (position)malloc(sizeof(position));
        L = H->thelists[ HashFunc( key, H->tablesize) ];
        newnode->data = key;
        newnode->next = L->next;
        L->next = newnode;
    }
    else
        return true;
}
void PrintHashTable(hashtable H)
{
    position P;
    int i = 0;
    for(i=0;i<H->tablesize;i++)
    {
        P = H->thelists[i]->next;
        printf("H->thelists[%d] = ",i);
        while(P != NULL)
        {
            printf(" %d ->",P->data);
            P=P->next;
        }
        printf("NULL\n");   
    }
}

bool containsDuplicate(int* nums, int numsSize) {
    hashtable H;
    int tablesize  = numsSize * 2;
    H = InitializeHashTable(tablesize);
    int i = 0;
    for(i=0; i< numsSize; i++){
        position pos,newnode;
        list L;
        pos = Find(nums[i],H);
        if(pos == NULL)
        {
            newnode = (position)malloc(sizeof(position));
            L = H->thelists[ HashFunc( nums[i], H->tablesize) ];
            newnode->data = nums[i];
            newnode->next = L->next;
            L->next = newnode;
        }
        else
            return true;
    }
    return false;
}

int main()
{
    int nums[5] = {1,0,34,56,57};
    bool r = containsDuplicate(nums,5);
    printf("containsDuplicate is : %d \n",r);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

[Leetcode]-Contains Duplicate HashTbale重解

标签:leetcode

原文地址:http://blog.csdn.net/xiabodan/article/details/46794723

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!