当前位置:网站首页>2020-11-07:已知一个正整数数组,两个数相加等于N并且一定存在,如何找到两个数相乘最小的两个数?
2020-11-07:已知一个正整数数组,两个数相加等于N并且一定存在,如何找到两个数相乘最小的两个数?
2020-11-07 23:08:00 【福大大架构师每日一题】
福哥答案2020-11-07:
1.哈希法。 2.排序+双指针夹逼。
golang代码如下:
package main
import (
"fmt"
"sort"
)
const INT_MAX = int(^uint(0) >> 1)
func main() {
nums := []int{2, 1, 3, 4, 5, 6, 9, 8, 7}
fmt.Println(twoSumMultiplication1(nums, 12), "哈希法")
fmt.Println(twoSumMultiplication2(nums, 12), "排序+双指针夹逼")
}
//哈希法
func twoSumMultiplication1(nums []int, target int) int {
map0 := make(map[int]struct{})
min := INT_MAX
for i := 0; i < len(nums); i++ {
complement := target - nums[i] //差值 = 目标值-元素值
if _, ok := map0[complement]; ok { //如果字典里有差值,说明已经找到了
//确保complement是较小的那个值
if complement > nums[i] {
complement, nums[i] = nums[i], complement
}
//谁小保存谁
if complement < min {
min = complement
//如果最小值是1,就不用循环了。
if min == 1 {
break
}
}
} else {
//如果字典里没有差值,缓存数组的当前值
map0[nums[i]] = struct{}{}
}
}
return min
}
//排序+双指针夹逼
func twoSumMultiplication2(nums []int, target int) int {
//排序
sort.Slice(nums, func(i, j int) bool {
return nums[i] < nums[j]
})
sumtemp := 0
min := INT_MAX
for i, j := 0, len(nums)-1; i < j; {
sumtemp = nums[i] + nums[j]
if target == sumtemp {
if min > nums[i] {
min = nums[i]
if min == 1 {
break
}
}
i++
} else if target > sumtemp {
i++
} else {
j--
}
}
return min
}
执行结果如下:
版权声明
本文为[福大大架构师每日一题]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4553401/blog/4707758
边栏推荐
猜你喜欢
Data structure and sorting algorithm
获取树形菜单列表
LadonGo开源全平台渗透扫描器框架
android基础-RadioButton(单选按钮)
Improvement of maintenance mode of laravel8 update
微服务的出现和意义的探索
Improvement of maintenance mode of laravel8 update
洞察——风格注意力网络(SANet)在任意风格迁移中的应用
Summary of the resumption of a 618 promotion project
Android Basics - RadioButton (radio button)
随机推荐
C / C + + Programming Notes: what are the advantages of C compared with other programming languages?
16.文件传输协议、vsftpd服务
Three steps, one pit, five steps and one thunder, how to lead the technical team under the rapid growth?
[solution] distributed timing task solution
Annual salary of 900000 programmers is not as good as 3800 civil servants a month? How to choose between stability and high income?
sed之查找替换
C language I blog assignment 03
Insight -- the application of sanet in arbitrary style transfer
ROS学习---远程启动ROS节点
Supervisor process management installation and use
How to think in the way of computer
洞察——风格注意力网络(SANet)在任意风格迁移中的应用
微信小程序request报400错误 @RequestBody接收不到
构造请求日志分析系统
What details does C + + improve on the basis of C
wanxin金融
手撕算法-手写单例模式
关于晋升全栈工程师,从入门到放弃的神功秘籍,不点进来看一看?
Git code submission operation, and git push prompt failed to push some refs'xxx '
工作1-3年的程序员,应该具备怎么样的技术能力?该如何提升?