LeetCode刷题:第二百一十七题 存在重复元素

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true

示例 2:

输入: [1,2,3,4]
输出: false

示例 3:

输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

哈希大法!

直接上代码

 1 typedef struct HashTable {
 2     int *data;
 3     int *flag;
 4     int size;
 5 } HashTable;
 6
 7 HashTable *init(int n) {
 8     HashTable *h = (HashTable *)malloc(sizeof(HashTable));
 9     h->data = (int *)malloc(sizeof(int) * n);
10     h->flag = (int *)calloc(sizeof(int), (n / 31 + 1));
11     h->size = n;
12     return h;
13 }
14
15 int hash(int val) {
16     return val & 0x7fffffff;
17 }
18
19 int check(HashTable *h, int ind) {
20     int x = ind / 31, y = ind % 31;
21     return h->flag[x] & (1 << y);
22 }
23
24 void set(HashTable *h, int ind, int val) {
25     int x = ind / 31, y = ind % 31;
26     h->flag[x] |= (1 << y);
27     h->data[ind] = val;
28     return ;
29 }
30
31 void insert(HashTable *h, int val) {
32     int ind = hash(val) % h->size;
33     int times = 1;
34     while (check(h, ind)) {
35         ind += (times * times);
36         ind %= h->size;
37     }
38     set(h, ind, val);
39     return ;
40 }
41
42 int query(HashTable *h, int val) {
43     int ind = hash(val) % h->size;
44     int times = 1;
45     while (check(h, ind) && h->data[ind] != val) {
46         ind += (times * times);
47         ind %= h->size;
48     }
49     return check(h, ind);
50 }
51
52 void clear(HashTable *h) {
53     if (h == NULL) return ;
54     free(h->data);
55     free(h->flag);
56     free(h);
57     return ;
58 }
59
60 bool containsDuplicate(int* nums, int numsSize){
61     HashTable *h = init(numsSize * 3);
62     for (int i = 0; i < numsSize; i++) {
63         if (query(h, nums[i])) {
64             clear(h);
65             return true;
66         }
67         insert(h, nums[i]);
68     }
69     clear(h);
70     return false;
71 }

原文地址:https://www.cnblogs.com/lihanwen/p/10981913.html

时间: 2024-10-29 13:31:41

LeetCode刷题:第二百一十七题 存在重复元素的相关文章

【leetcode 简单】 第七十七题 单词模式

给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式. 示例1: 输入: pattern = "abba", str = "dog cat cat dog" 输出: true 示例 2: 输入:pattern = "abba", str = "dog cat cat fish&

【LeetCode链表】删除排序链表中的重复元素 II

题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 做这题之前,可以先做删除排序链表中的重复元素,题解. 思路 这题是<剑指Offer>上的一道题.我们需要保存3个指针:

【leetcode 简单】 第六十七题 回文链表

请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def r

【leetcode 简单】第四十七题 旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4] 示例 2: 输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,

【leetcode 简单】 第八十七题 两整数之和

不使用运算符 + 和-,计算两整数a .b之和. 示例: 若 a = 1 ,b = 2,返回 3. class Solution: def getSum(self, a, b): """ :type a: int :type b: int :rtype: int """ # return sum([a,b]) first=a^b second=(a&b)<<1 return sum([first,second]) 参考:htt

【leetcode 简单】 第一百一十题 分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ,都有一个尺寸 sj .如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足.你的目标是尽可能满足越多数量的孩子,并输出这个最大数值. 注意: 你可以假设胃口值为正. 一个小朋友最多只能拥有一块饼干. 示例 1: 输入: [1,2,3], [1,1] 输出: 1 解释: 你有三个

【leetcode 简单】第十八题 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* deleteDupli

[LC]219题 Contains Duplicate II (存在重复元素 II )

①英文题目: Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k. Example 1: Input: nums = [1,2,3,1], k = 3Ou

(每日算法)LeetCode --- Remove Duplicates from Sorted Array II (删除重复元素II)

Remove Duplicates from Sorted Array II Leetcode 题目: Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For example, Given sorted array A = [1,1,1,2,2,3], Your function should return length = 5, and A is now [1,1,2,2