国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium)

這篇具有很好參考價值的文章主要介紹了【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium),算法
??你好,我是 RO-BERRY
?? 致力于C、C++、數(shù)據(jù)結(jié)構、TCP/IP、數(shù)據(jù)庫等等一系列知識
??感謝你的陪伴與支持 ,故事既有了開頭,就要畫上一個完美的句號,讓我們一起加油

【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium),算法



前言

雙指針
常見的雙指針有兩種形式,一種是對撞指針,?種是左右指針。
對撞指針:一般用于順序結(jié)構中,也稱左右指針。

  • 對撞指針從兩端向中間移動。一個指針從最左端開始,另?個從最右端開始,然后逐漸往中間逼
    近。
  • 對撞指針的終止條件一般是兩個指針相遇或者錯開(也可能在循環(huán)內(nèi)部找到結(jié)果直接跳出循
    環(huán)),也就是:
    • left == right (兩個指針指向同一個位置)
    • left > right (兩個指針錯開)

快慢指針:又稱為龜兔賽跑算法,其基本思想就是使用兩個移動速度不同的指針在數(shù)組或鏈表等序列
結(jié)構上移動。
這種方法對于處理環(huán)形鏈表或數(shù)組非常有用。
其實不單單是環(huán)形鏈表或者是數(shù)組,如果我們要研究的問題出現(xiàn)循環(huán)往復的情況時,均可考慮使用快
慢指針的思想。

快慢指針的實現(xiàn)方式有很多種,最常用的?種就是:

  • 在一次循環(huán)中,每次讓慢的指針向后移動一位,而快的指針往后移動兩位,實現(xiàn)一快一慢。

1. 快樂數(shù)(medium)

題目描述:
編寫一個算法來判斷一個數(shù) n 是不是快樂數(shù)。
「快樂數(shù)」 定義為:

對于一個正整數(shù),每一次將該數(shù)替換為它每個位置上的數(shù)字的平方和。
然后重復這個過程直到這個數(shù)變?yōu)?1,也可能是 無限循環(huán) 但始終變不到 1。
如果這個過程 結(jié)果為 1,那么這個數(shù)就是快樂數(shù)。
如果 n 是 快樂數(shù) 就返回 true ;不是,則返回 false 。

示例 1:

輸入:n = 19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82= 100
12 + 02+ 02 = 1

示例 2:

輸入:n = 2
輸出:false

提示:

1 <= n <= 231 - 1

2. 解法

思路:
可以把題目中的兩種情況當成一種情況來看,就是一直在死循環(huán)

  1. 對于情況一:?直在 1 中死循環(huán)
  2. 對于情況二:在歷史的數(shù)據(jù)中死循環(huán),但始終變不到 1

為什么會死循環(huán)?

題目所給數(shù)據(jù)范圍是小于整型(int)的最大值 231-1=2147483647,這里我們們不難發(fā)現(xiàn)最大值的位數(shù)是 10,那么我們可以用一個十位數(shù)的最大值來變換,即 9999999999,那么它經(jīng)過變換得到的值就是 92 * 10 = 810 ,那么經(jīng)過所有變換的結(jié)果就會在區(qū)間 [1, 810] 之間;
根據(jù)【鴿巢原理】,?個數(shù)變化 811 次之內(nèi),必然會在一個循環(huán)中有重復。
因此,可以?「快慢指針」來解決。

解題方法:

  1. ProductSum 函數(shù):
  • 這個函數(shù)計算一個整數(shù)的每個位上數(shù)字的平方和。
  • 通過不斷地對整數(shù)取模 10 來獲取其最后一位數(shù)字,然后將其平方并累加到 sum 變量中。
  • 每次迭代,整數(shù)都通過整除 10 來移除最后一位數(shù)字。
  • 當整數(shù)變?yōu)?0 時,函數(shù)返回累加的和 sum。
  1. isHappy 函數(shù):
  • 使用“快慢指針”技術來檢測循環(huán)。
  • slow 和 fast 初始時都指向 n。
  • slow 每次移動一步,即計算當前數(shù)字的平方和。
  • fast 每次移動兩步,即連續(xù)計算兩次平方和。
  • 如果 n 是一個快樂數(shù),slow 和 fast 最終都會達到 1。
  • 如果 n 進入循環(huán),slow 和 fast 會在循環(huán)中的某個點相遇(即它們的值相等)。
  • 如果 slow 和 fast 相等且等于 1,則 n 是快樂數(shù)。
  • 算法中使用了 do-while 循環(huán)而不是 while 循環(huán),以確保至少執(zhí)行一次循環(huán)體(即至少計算一次ProductSum),即使 slow 和 fast 初始時就相等。

復雜度

時間復雜度: O(logN)
空間復雜度: O(1)

C++算法代碼:

class Solution {
public:
    int ProductSum(int n)
    {
        int sum = 0;
        while(n)
        {
            int temp = n % 10;
            sum += temp*temp;
            n /= 10;
        }
        return sum;
    }

    bool isHappy(int n) {
        int slow = n,fast = n;
        // 快慢指針,找環(huán)的相遇位置
        do
        {
            slow = ProductSum(slow);
            fast = ProductSum(ProductSum(fast));
        }while(slow != fast);
        // 如果相遇時是 1 就是快樂數(shù)
        return slow == 1;
    }
};

【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium),算法
java算法代碼:

class Solution
{
	public int bitSum(int n) // 返回 n 這個數(shù)每?位上的平?和
	{
		int sum = 0;
		while (n != 0)
		{
			int t = n % 10;
			sum += t * t;
			n /= 10;
		}
		return sum;
 	}
 	public boolean isHappy(int n)
 	{
		 int slow = n, fast = bitSum(n);
		 while (slow != fast)
		{
			 slow = bitSum(slow);
			 fast = bitSum(bitSum(fast));
		 }
	 return slow == 1;
	 }
}

【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium),算法

3. 盛水最多的容器(medium)

題目描述:

給定一個長度為 n 的整數(shù)數(shù)組 height 。有 n 條垂線,第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。
找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
返回容器可以儲存的最大水量。
說明:你不能傾斜容器。

示例 1:
【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium),算法

輸入:[1,8,6,2,5,4,8,3,7]
輸出:49
解釋:圖中垂直線代表輸入數(shù)組 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

示例 2:

輸入:height = [1,1]
輸出:1

提示:

n == height.length
2 <= n <= 105
0 <= height[i] <= 104

4. 解法

解法一(暴力求解)(會超時):

算法思路:
枚舉出能構成的所有容器,找出其中容積最大的值。

容器容積的計算方式:
設兩指針 i , j,分別指向水槽板的最左端以及最右端,此時容器的寬度為j - i
容器的高度由兩板中的短板決定,因此可得容積公式︰v = (j - i) * min(height[il, height[j])

算法代碼:

class Solution {
public:
	int maxArea(vector<int>& height) {
		int n = height.size();
		int ret = 0;
		// 兩層 for 枚舉出所有可能出現(xiàn)的情況
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				// 計算容積,找出最?的那?個
				ret = max(ret, min(height[i], height[j]) * (j - i));
			}
		}
		return ret;
	}
};

解法二(對撞指針):

算法思路:
設兩個指針 left , right 分別指向容器的左右兩個端點,此時容器的容積 : v = (right - left) * min( height[right], height[left])
容器的左邊界為height[left],右邊界為 height[right] 。
為了方便敘述,我們假設「左邊邊界」小于「右邊邊界」. 如果此時我們固定一個邊界,改變另一個邊界,水的容積會有如下變化形式:

  • 容器的寬度?定變小
  • 由于左邊界較小,決定了?的?度.如果改變左邊界,新的水面高度不確定,但是?定不會超過右邊的柱子高度,因此容器的容積可能會增大.
  • 如果改變右邊界,無論右邊界移動到哪里,新的水面的高度?定不會超過左邊界,也就是不會超過現(xiàn)在的水面高度,但是由于容器的寬度減小,因此容器的容積?定會變小的.
  • 由此可見,左邊界和其余邊界的組合情況都可以舍去.所以我們可以 left++ 跳過這個邊界,繼續(xù)去判斷下?個左右邊界.

當我們不斷重復上述過程,每次都可以舍去?量不必要的枚舉過程,直到 left 與 right 相 遇.期間產(chǎn)生的所有的容積里面的最大值,就是最終答案.

C++ 算法代碼:

class Solution
{
public:
	int maxArea(vector<int>& height)
	{
		int left = 0, right = height.size() - 1, ret = 0;
		while (left < right)
		{
			int v = min(height[left], height[right]) * (right - left);
			ret = max(ret, v);
			// 移動指針
			if (height[left] < height[right]) left++;
			else right--;
		}
		return ret;
	}
};

【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium),算法
Java 算法代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-842776.html

class Solution
{
	public int maxArea(int[] height)
	{
		int left = 0, right = height.length - 1, ret = 0;
		while (left < right)
		{
			int v = Math.min(height[left], height[right]) * (right - left);
			ret = Math.max(ret, v);
			if (height[left] < height[right]) left++;
			else right--;
		}
		return ret;
	}
}

到了這里,關于【算法專題--雙指針算法】leecode-202. 快樂數(shù)(medium)、leecode-11. 盛最多水的容器(medium)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【算法專題突破】雙指針 - 盛最多水的容器(4)

    【算法專題突破】雙指針 - 盛最多水的容器(4)

    目錄 1. 題目解析 2. 算法原理 3. 代碼編寫 寫在最后: 題目鏈接:11. 盛最多水的容器 - 力扣(Leetcode)? ?這道題目也不難理解, 兩邊的柱子的盛水量是根據(jù)短的那邊的柱子決定的, 而盛水量就是短的柱子的高度 * 寬度即可。 ?這道題可以用暴力枚舉,兩層for循環(huán),肯定是可

    2024年02月10日
    瀏覽(19)
  • 【算法專題突破】雙指針 - 快樂數(shù)(3)

    【算法專題突破】雙指針 - 快樂數(shù)(3)

    目錄 1. 題目解析 2. 算法原理 3. 代碼編寫 寫在最后: 題目鏈接:202. 快樂數(shù) - 力扣(Leetcode) 這道題的題目也很容易理解, 看一下題目給的示例就能很容易明白, 但是要注意一個點,最后有可能無限循環(huán)無法到達1。 這個時候我們就要想一下怎么判斷他是無線循環(huán)呢? 實際

    2024年02月11日
    瀏覽(17)
  • 【算法——雙指針】LeetCode 11 盛最多水的容器

    【算法——雙指針】LeetCode 11 盛最多水的容器

    題目描述: 解題思路: ????????如圖所示: ????????1、我們考慮相距最遠的兩個柱子所能容納水的面積。寬度是兩根柱子之間的距離8;高度取決于兩根柱子之間較短的那個,即左邊柱子的高度3。水的面積就是3×8=24。 ????????2、如果選擇固定一根柱子,另外一根

    2024年02月12日
    瀏覽(21)
  • 【算法|雙指針系列No.4】leetcode11. 盛最多水的容器

    【算法|雙指針系列No.4】leetcode11. 盛最多水的容器

    個人主頁:兜里有顆棉花糖 歡迎 點贊?? 收藏? 留言? 加關注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學習過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進步。

    2024年02月06日
    瀏覽(23)
  • 力扣-202. 快樂數(shù)解析-弗洛伊德循環(huán)查找算法

    力扣-202. 快樂數(shù)解析-弗洛伊德循環(huán)查找算法

    題目鏈接 ? 使用代碼測試一下每一代數(shù)字? 可以發(fā)現(xiàn) 歸納一下這些簡單數(shù)字就可以發(fā)現(xiàn),對于任意一個非快樂數(shù),最終會進入重復循環(huán), ···不難發(fā)現(xiàn),4即之后的結(jié)果就是新一輪循環(huán)。 那么我的第一個做法是檢測4出現(xiàn)的次數(shù) 如果4出現(xiàn)次數(shù)超過兩次, 那么就不是快樂數(shù) 感

    2024年01月20日
    瀏覽(24)
  • 【算法】雙指針求解盛最多水的容器

    【算法】雙指針求解盛最多水的容器

    Problem: 11. 盛最多水的容器 首先我們來解析一下本題 題目中說到,要找出其中的兩條線, 使得它們與 x 軸共同構成的容器可以容納最多的水 。 那我們現(xiàn)在來看最外側(cè)的兩根,一個高度為8,一個則為7,那我們肯定選擇高度為7的, 如果選擇8的話就會出現(xiàn)溢出的問題 ;我們這

    2024年02月11日
    瀏覽(21)
  • 算法訓練第5天|哈希表理論基礎 242.有效的字母異位詞 349. 兩個數(shù)組的交集 202. 快樂數(shù) 1. 兩數(shù)之和

    算法訓練第5天|哈希表理論基礎 242.有效的字母異位詞 349. 兩個數(shù)組的交集 202. 快樂數(shù) 1. 兩數(shù)之和

    哈希表是根據(jù) 關鍵碼 的值而直接進行訪問的數(shù)據(jù)結(jié)構。 一般哈希表都是用來快速判斷一個元素是否出現(xiàn)集合里。 數(shù)組、集合set、映射map 力扣鏈接 題目描述: 給定兩個字符串 s 和 t ,編寫一個函數(shù)來判斷 t 是否是 s 的字母異位詞。 注意: 若? s ?和? t ? 中每個字符出現(xiàn)的

    2024年02月19日
    瀏覽(23)
  • 【算法】雙指針——leetcode盛最多水的容器、劍指Offer57和為s的兩個數(shù)字

    【算法】雙指針——leetcode盛最多水的容器、劍指Offer57和為s的兩個數(shù)字

    盛水最多的容器 (1)暴力解法 ??算法思路:我們枚舉出所有的容器大小,取最大值即可。 ??容器容積的計算方式: ??設兩指針 i , j ,分別指向水槽板的最左端以及最右端,此時容器的寬度為 j - i 。由于容器的高度由兩板中的較短的板決定,因此可得容積公式 :

    2024年02月13日
    瀏覽(25)
  • 【力扣算法12】之 11. 盛最多水的容器 python

    【力扣算法12】之 11. 盛最多水的容器 python

    給定一個長度為 n 的整數(shù)數(shù)組 height 。有 n 條垂線,第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。 返回容器可以儲存的最大水量。 說明 :你不能傾斜容器。 輸入:[1,8,6,2,5,4,8,3,7] 輸出:49 解釋:圖中垂

    2024年02月16日
    瀏覽(20)
  • 【力扣】202. 快樂數(shù) <哈希>

    編寫一個算法來判斷一個數(shù) n 是不是快樂數(shù)。 【快樂數(shù)】 定義為: 對于一個正整數(shù),每一次將該數(shù)替換為它每個位置上的數(shù)字的平方和。 然后重復這個過程直到這個數(shù)變?yōu)?1,也可能是 無限循環(huán) 但始終變不到 1。 如果這個過程 結(jié)果為 1,那么這個數(shù)就是快樂數(shù)。 如果 n 是

    2024年02月11日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包