首页 > 其他分享 >ARTS_2

ARTS_2

时间:2022-10-08 11:36:21浏览次数:67  
标签:ARTS nums int goja vm func 指针

概述

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. 算出\(1...N\)的和,之后减去这个数组的和,你就获得了\(a+b\)的值

  2. 算出\(1^2...N^2\)的和,之后减去这个数组的平方和,你就获得了\(a^2 + b^2\)

  3. 之后就是联立得到一元二次方程:

    \((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

相关文章