[Leetcode]-Contains Duplicate HashTbale重解

原创 2015年07月07日 21:54:23

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-面试算法经典-Java实现】【219-Contains Duplicate II(包含重复元素II)】

【219-Contains Duplicate II(包含重复元素II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月29日 06:36
  • 3247

【LeetCode-面试算法经典-Java实现】【217-Contains Duplicate(包含重复元素)】

【217-Contains Duplicate(包含重复元素)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-C...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月28日 07:00
  • 2697

ButterKnife源码分析

0 使用手册http://jakewharton.github.io/butterknife/1 使用方法简介 class ExampleActivity extends Activity { @...
  • qq373432361
  • qq373432361
  • 2015年03月15日 16:16
  • 1912

Leetcode 220. Contains Duplicate III

Given an array of integers, find out whether there are two distinct indices i and j in the array suc...
  • xinqrs01
  • xinqrs01
  • 2017年02月10日 14:08
  • 178

LeetCode 217. Contains Duplicate 解题报告

LeetCode 217. Contains Duplicate 解题报告
  • camellhf
  • camellhf
  • 2016年10月05日 17:36
  • 243

leetcode217 Contains Duplicate(JavaScript)

问题题目地址:leetcode217 翻译: 给定一个整数数组,找出其中有无至少出现两次的数,有,返回true,没有,返回false。 举例: 输入:[1,2,3] 输出:false 输入...
  • bobshui
  • bobshui
  • 2016年07月07日 14:47
  • 147

【leetcode】219. Contains Duplicate II

一、题目描述 Given an array of integers and an integer k, find out whether there are two distinct indic...
  • xiaoquantouer
  • xiaoquantouer
  • 2016年06月24日 10:24
  • 149

Contains Duplicate - LeetCode 217

题目描述: Given an array of integers, find if the array contains any duplicates. Your function should r...
  • bu_min
  • bu_min
  • 2015年05月25日 20:58
  • 260

【LEETCODE】217-Contains Duplicate

Given an array of integers, find if the array contains any duplicates.  Your function should return...
  • aliceyangxi1987
  • aliceyangxi1987
  • 2015年11月27日 14:59
  • 373

算法Week02.01 - LeetCode 217. Contains Duplicate

LeetCode 217. Contains Duplicate
  • lukeluocn
  • lukeluocn
  • 2016年09月11日 18:00
  • 272
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Leetcode]-Contains Duplicate HashTbale重解
举报原因:
原因补充:

(最多只允许输入30个字)