前言
今天周天,按照计划,数组要告一段落了,周末这两天确实有点懈怠,另一个栏目没有写出来...
内容
一、三个数的最大乘积
给你一个整型数组 nums
,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
思路一
整体的思想 返回最大乘积 而不是找出组成最大乘积的三个数 最大乘积有哪些情况: 三个正数 最大一正最小两负 //44ms 6.3MB
func maximumProduct(nums []int) int {
sort.Ints(nums)
n:=len(nums)
return max(nums[0]*nums[1]*nums[n-1],nums[n-1]*nums[n-2]*nums[n-3])
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
思路二
前面主要是排序消耗时间空间 这次不排序 把需要的五个数找出来 //28ms 6.3MB
func maximumProduct(nums []int)int{
min1,min2,max1,max2,max3:=1000,1000,-1000,-1000,-1000
for _,v:=range nums{
if v<min1{
min1,min2=v,min1
}else if v<min2{
min2=v
}
if v>max1{
max1,max2,max3=v,max1,max2
}else if v>max2{
max2,max3=v,max2
}else if v>max3{
max3=v
}
}
return max(min1*min2*max1,max1*max2*max3)
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
二、错误的集合
集合 s
包含从 1
到 n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums
代表了集合 S
发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
哈希表
用哈希表记录每个元素在数组中出现的次数,然后遍历 分别找到出现 2次和出现 0次的数字,即为重复的数字和丢失的数字。//36ms 6.53MB 感觉用哈希表就挺好 奈何效率太低了
func findErrorNums(nums []int) []int {
hashTable:=make(map[int]int)
for _,v:=range nums{
hashTable[v]++
}
arr:=make([]int ,2)
for i:=1;i<=len(nums);i++{
c:=hashTable[i]
if c==2{
arr[0]=i
}else if c==0{
arr[1]=i
}
}
return arr
}
为什么不能是for i := 0; i <len(nums)-1; i++
如果我们输入的 nums 是 [1,2,2,4],那么在计数阶段,hashTable会是 {1: 1, 2: 2, 4: 1}。在最后的迭代中,i 的值将会等于 3,但我们不能访问 hashTable[3],因为hashTable是一个整数到整数的映射,没有整数有索引 3。
因此,正确的循环应该是 for i := 1; i <= len(nums); i++
(对哈希表的理解又多了一点)
排序
排序后,相邻元素相等则为重复元素,为了寻找丢失的数字,需要在遍历已排序数组的同时记录上一个元素,然后计算当前元素与上一个元素的差 考虑到丢失的数字可能是1,因此需要将上一个元素初始化为0!//32ms 6.13MB
func findErrorNums(nums []int)[]int{
sort.Ints(nums)
arr:=make([]int,2)
pre:=0
for _,v:=range nums{
if v==pre{
arr[0]=v
}else if v-pre>1{
arr[1]=pre+1
}
pre=v
}
if nums[len(nums)-1]!=len(nums){
arr[1]=len(nums)
}
return arr
}
最后
写数组总结去。