概述
ARTS 是耗子叔发起的编程挑战:
每周完成一个ARTS: 每周至少做一个 leetcode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tip、Share 简称ARTS)
Algorithm
https://leetcode.cn/problems/missing-two-lcci/
浅浅挑了一道简单hard。跟之前有道找到数组中消失的一个数字很像。感觉就是套用做法。
My Solution:
func missingTwo(nums []int) []int {
nums = append(nums, -1, -1)
for i := range nums {
for {
if nums[i] == -1 || nums[i] == i+1 {
break
}
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
}
}
res := make([]int, 0, 2)
for i := range nums {
if nums[i] == -1 {
res = append(res, i+1)
}
}
return res
}
go还是挺快的,我C++就打败了20%,go就90%。不过空间因为我没有预先分配,所以就打败了40%。
在评论区看到了两种其他做法。
第一种:
-
算出\(1...N\)的和,之后减去这个数组的和,你就获得了\(a+b\)的值
-
算出\(1^2...N^2\)的和,之后减去这个数组的平方和,你就获得了\(a^2 + b^2\)
-
之后就是联立得到一元二次方程:
\((a + b) \pm \sqrt{(2(a ^ 2 + b ^ 2) - 2 (a+b)^2))}\)
解出来就是a,b的值,记得取绝对值。
ps:不过这个做法有点问题就是要是暴力先算平方和的话,会爆int,要是边加边减应该没问题。
(纪念一下终于用上了latex
标签:ARTS,nums,int,goja,vm,func,指针 From: https://www.cnblogs.com/Vikyanite/p/16768379.html