力扣刷题第六天--数组篇

前言

今天周天,按照计划,数组要告一段落了,周末这两天确实有点懈怠,另一个栏目没有写出来...

内容

一、三个数的最大乘积

628.三个数的最大乘积

给你一个整型数组 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
}
二、错误的集合

645.错误的集合

集合 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
}

最后

写数组总结去。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值