日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 633. 平方数之和(双指针)

發(fā)布時(shí)間:2023/11/29 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 633. 平方数之和(双指针) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

給定一個(gè)非負(fù)整數(shù)?c?,你要判斷是否存在兩個(gè)整數(shù) a 和 b,使得?a2 + b2 = c 。

示例 1:

輸入:c = 5
輸出:true
解釋:1 * 1 + 2 * 2 = 5
示例 2:

輸入:c = 3
輸出:false
示例 3:

輸入:c = 4
輸出:true
示例 4:

輸入:c = 2
輸出:true
示例 5:

輸入:c = 1
輸出:true

提示:

0 <= c <= 231 - 1

解題思路

維護(hù)l,r兩個(gè)元素值,l=0,r=sqrt?,滿足了l<=r條件,當(dāng)ll+rr小于目標(biāo)值,就需要移動(dòng)左指針。當(dāng)ll+rr大于目標(biāo)值,說明元素太大了,就需要移動(dòng)右指針。

原理

相當(dāng)于每次固定一個(gè)右邊界,然后收縮左邊界。
為什么每次左指針不從1開始遍歷,而是從上次的左指針開始?
因?yàn)槊看胃鼡Q右邊界的條件是ll+rr>c, 這證明當(dāng)前兩個(gè)左指針的平方和太大了,所以需要換一個(gè)更小的右指針。那左指針前面的值為什么不行呢?

例如l-1,因?yàn)閘是由l-1轉(zhuǎn)移來的,而l-1轉(zhuǎn)移到l的條件是l*l+r-r<c(注意:這里的r是縮減邊界前的r)),在r更大的情況下,l-1產(chǎn)生的平方和都是偏小了,而現(xiàn)在又邊界還收縮了,產(chǎn)生的平方和就更小了,所以根本不需要從1重新遍歷一次,直接從左指針開始就可以了。

代碼

func judgeSquareSum(c int) bool {l,r:=0,int(math.Sqrt(float64(c)))for l<=r {cur:=l*l+r*rif cur==c{return true}else if cur<c{l++}else {r--}}return false}

復(fù)雜度分析

時(shí)間復(fù)雜度:O(sqrt?)。最壞情況下 l 和 r 一共枚舉了 0 到 sqrt?
里的所有整數(shù)。

空間復(fù)雜度:O(1)。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的leetcode 633. 平方数之和(双指针)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。