Title:
Given an integer array nums
. Return true if any value appears at least twice in the array, and return false if every element is distinct.
Example 1:
Input: nums = [1,2,3,1]
Output: true
Example 2:
Input: nums = [1,2,3,4]
Output: false
Example 3:
Input: nums = [1,1,1,3,3,4,3,2,4,2]
Output: true
Hints:
1 <= nums.length
<= 10^5
-10^9 <= nums[i]
<= 10^9
Source: LeetCode
Link: https://leetcode-cn.com/problems/contains-duplicate
Implementation in Go.
First method, sort first, then check each element.
func containsDuplicate(nums []int) bool {
sort.Ints(nums)
for i := 0; i < len(nums)-1; i++ {
if nums[i] == nums[i+1] {
return true
}
}
return false
}
Second method, use a hash table for checking:
func containsDuplicate(nums []int) bool {
m := make(map[int]bool)
for i := 0; i < len(nums); i++ {
if m[nums[i]] {
return true
}
m[nums[i]] = true
}
return false
}
Third method, implement a simple hash table yourself, which only has keys without values:
func containsDuplicate(nums []int) bool {
hash := InitHashTable(len(nums))
for i := 0; i < len(nums); i++ {
if exist := hash.Set(nums[i]); exist {
return exist
}
}
return false
}
type hashNode struct {
key int
next *hashNode
}
// HashTable structure
type HashTable struct {
table []*hashNode
length int
}
func InitHashTable(n int) *HashTable {
return &HashTable{
table: make([]*hashNode, n),
length: n,
}
}
func (hash *HashTable) GetHashCode(key int) int {
return int(math.Abs(float64(key))) % hash.length
}
// Set method to insert an element
func (hash *HashTable) Set(key int) bool {
index := hash.GetHashCode(key)
// No element at this position yet
if hash.table[index] == nil {
hash.table[index] = &hashNode{
key: key,
}
} else {
node := hash.table[index]
for {
// If key is the same, override and return old value
if node.key == key {
return true
}
// Can insert the element
if node.next == nil {
node.next = &hashNode{
key: key,
}
return false
}
// Next search
node = node.next
}
}
return false
}
Memory consumption can be further reduced by controlling the index size of the hash table:
func containsDuplicate(nums []int) bool {
hash := InitHashTable(len(nums) / 2)
... ...
}
func InitHashTable(n int) *HashTable {
if n == 0 {
n = 1
}
... ...
}
文章评论