leetcode 202. 快乐数 思考分析(哈希集合与双指针解)
1、題目
編寫一個(gè)算法來判斷一個(gè)數(shù) n 是不是快樂數(shù)。
「快樂數(shù)」定義為:對于一個(gè)正整數(shù),每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和,然后重復(fù)這個(gè)過程直到這個(gè)數(shù)變?yōu)?1,也可能是 無限循環(huán) 但始終變不到 1。如果 可以變?yōu)?1,那么這個(gè)數(shù)就是快樂數(shù)。
如果 n 是快樂數(shù)就返回 True ;不是,則返回 False 。
2、思考分析
對一個(gè)數(shù)不斷進(jìn)行g(shù)et_sum操作,那么最終可能的結(jié)果有兩種可能:
1、得到1
2、計(jì)算的數(shù)陷入某種循環(huán),然后會有重復(fù)的數(shù)出現(xiàn)
如果得到1,直接返回true;
如果檢測到重復(fù)數(shù)出現(xiàn)就返回false;
否則記錄出現(xiàn)的數(shù),并在while循環(huán)中對n進(jìn)行更新。
3、哈希法解
class Solution { public:int get_sum(int n){int sum=0;while(n!=0){sum+=(n%10)*(n%10);n = n/10;}return sum;}bool isHappy(int n) {int sum=0;//sum,sum出現(xiàn)的頻次unordered_set<int> set;while(1){sum=get_sum(n);if(sum ==1) return true;//如果某個(gè)數(shù)重復(fù)出現(xiàn),那么我們認(rèn)為此時(shí)陷入了循環(huán),則這個(gè)數(shù)不是快樂數(shù)else if(set.find(sum)!=set.end()){return false;}set.insert(sum);n=sum;}} };4、雙指針解
我們得到的結(jié)果序列是一個(gè)隱式的鏈表。
隱式意味著我們沒有實(shí)際的鏈表節(jié)點(diǎn)和指針,但數(shù)據(jù)仍然形成鏈表結(jié)構(gòu)。
于是這個(gè)問題可以轉(zhuǎn)換為檢測一個(gè)鏈表是否有環(huán)。
這個(gè)問題可以使用快慢指針法來解決。我們不是只跟蹤鏈表中的一個(gè)值,而是跟蹤兩個(gè)值,稱為快跑者和慢跑者。在算法的每一步中,慢速在鏈表中前進(jìn) 1 個(gè)節(jié)點(diǎn),快跑者前進(jìn) 2 個(gè)節(jié)點(diǎn)。
前進(jìn)一次調(diào)用一次計(jì)算函數(shù),前進(jìn)兩次調(diào)用兩次計(jì)算函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的leetcode 202. 快乐数 思考分析(哈希集合与双指针解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++grammar】代理构造、不可变
- 下一篇: 电信流量多少钱一兆啊?