力扣編程題算法初階之雙指針算法+代碼分析

?

目錄

?

第一題:復寫零

第二題:快樂數:

第三題:盛水最多的容器

第四題:有效三角形的個數


?

第一題:復寫零

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

4051a80d6d164901a9df13aaf75c68fa.png思路:

上期介紹到雙指針,這次來用雙指針實際操作。第一種從前往后復寫,會導致為復寫的數字被覆蓋,因此選擇從后往前復寫,那么先找到復寫的最后一個元素,再從后往前復寫即可。

步驟

1.初始化指針

2.找復寫

3.處理邊界問題

4.開始復寫

class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur = 0, dest = -1, n = arr.size();
while (cur < n)
{if (arr[cur]) dest++;//說明不用復寫else dest += 2;if (dest >= n - 1)break;cur++;
}
//出來的時候cur就是莫位置
//處理邊界
if (dest == n)
{arr[n - 1] = 0;cur--; dest -= 2;
}
//從后往前面復寫
while (cur >= 0)
{if (arr[cur])//非0arr[dest--] = arr[cur--];else//為0{arr[dest--] = 0;arr[dest--] = 0;cur--;}
}}
};

第二題:快樂數:

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

39f647b4389e49d9bd1c8a18711fba8d.png

?

思路:

這題通過在紙上演算可以發現,給定一個數他按照快樂數的定義,要么演變到1,要么將會重復他在演變過程中的一個數字,具體大家可以在紙上推算一遍

2 -> 4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4 -> 16,即形成了一個循環圈
而另外一種變成一,其實也可以看作是一個循環圈,即給定一個數,按照快樂數的定義,我給出兩個指針,一個移動地快一個移動地慢,最終兩個數一定會相等,倘若等于1,那么就是快樂數,倘若不等于1就不是快樂數
因此步驟
1.先把n的每一位提出,直到n為0
2.接著只要兩個指針不相等就一直重復快樂數定義,直到相等退出循環,判斷是否為1

class Solution
{
public:int bitSum(int n)int sum = 0;while (n){int t = n % 10;sum += t * t;n /= 10;}bool isHappy(int n){int slow = n, fast = bitSum(n);while (slow != fast){slow = bitSum(slow);fast = bitSum(bitSum(fast));}return slow == 1;}
};

第三題:盛水最多的容器

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

1671d1750cbc4aea9e2f2666eb96c629.png思路:

第一想法就是暴力枚舉

s=h(高)*w(寬度)

即弄兩個for循環,依次求出面積,再比較最大值,這樣時間復雜度為n的平方會超時,因此

第二種就是雙指針,觀察發現,面積的高是由左右兩邊的低邊界為準。就以上圖為例,高是由右邊那條高決定,左邊高往右移動由于w一定減小,h要么減小要么不變,那么面積一定減小,所以我們就從兩個邊界開始來移動,記錄每一次的面積,返回最大即可

注意,每次移動的是那個h小的,因為大h移動,s要么減少要么不變,而我們求的是最大的。

第一種:暴力求解

class Solution {
public:int maxArea(vector<int>& height) {int n = height.size();int ret = 0;// 兩層 for 枚舉出所有可能出現的情況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;}
};

第二種:

對撞指針:

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;}
};

第四題:有效三角形的個數

力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺

1beb293f72164e8e97fc0d95d05ed03e.png思路:

在判斷一個三角形時,如果對于一對升序數組a,b,c

如果a+b>c那么即可構成三角形,不需要判斷三次

原因,如果上述條件成立那么,b+c>a,a+c>b一定成立,因為c是最大的數

第一思路就是暴力求解,先把給定數組排序,然后從第一個元素開始遍歷,用三個for循環實現,但是時間復雜度較大,運行會超時

class Solution {
public:int triangleNumber(vector<int>& nums) {// 1. 排序sort(nums.begin(), nums.end());int n = nums.size(), ret = 0;// 2. 從?到?枚舉所有的三元組for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {for (int k = j + 1; k < n; k++) {// 當最?的兩個邊之和?于第三邊的時候,統計答案if (nums[i] + nums[j] > nums[k])ret++;}}}return ret;}
};

應次這里換一種高效方法就是用雙指針來實現,因為已經排完升序,依據暴力解法,可以先固定一條最長邊,然后找出比這條邊小的二元組,讓著個二元組的和大于最長邊,即可利用對撞指針來實現。

最長邊枚舉i位置,區間[left,right]是i位置左邊區間,
如果nums[left]+nums[right]>num[i],那么就有right-left種,因為是升序
否則,那么就舍棄left當前元素,left++進入下一輪循環
class Solution
{
public:int triangleNumber(vector<int>& nums){// 1. 優化sort(nums.begin(), nums.end());// 2. 利?雙指針解決問題int ret = 0, n = nums.size();for (int i = n - 1; i >= 2; i--) // 先固定最?的數{// 利?雙指針快速統計符合要求的三元組的個數int left = 0, right = i - 1;while (left < right){if (nums[left] + nums[right] > nums[i]){ret += right - left;right--;}else{left++;}}}return ret;}
};

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214201.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SpringBoot教程】SpringBoot 統一異常處理(附核心工具類-ErrorInfoBuilder)

作者簡介&#xff1a;大家好&#xff0c;我是擼代碼的羊駝&#xff0c;前阿里巴巴架構師&#xff0c;現某互聯網公司CTO 聯系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我進群&#xff0c;大家一起學習&#xff0c;一起進步&#xff0c;一起對抗…

曲線分板機主軸有何特點?如何選擇合適的曲線分板機主軸?

在現代工業領域&#xff0c;分板機主軸作為重要的機械部件&#xff0c;其性能和質量對于生產效率和產品質量具有至關重要的影響。而在這其中&#xff0c;曲線分板機主軸則因為其獨特的優勢而被廣泛應用于PCB電路板的切割和分板。面對市場上眾多的曲線分板機主軸品牌&#xff0c…

【深度學習】loss與梯度與交叉熵的關系

問的GPT3.5 模型訓練時loss與梯度的關系&#xff1f; 在深度學習模型訓練過程中&#xff0c;loss&#xff08;損失函數&#xff09;與梯度&#xff08;gradient&#xff09;之間存在密切關系。損失函數衡量模型在給定輸入上的預測輸出與實際輸出之間的差距&#xff0c;而梯度則…

Leetcode 2958. Length of Longest Subarray With at Most K Frequency

Leetcode 2958. Length of Longest Subarray With at Most K Frequency 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2958. Length of Longest Subarray With at Most K Frequency 1. 解題思路 這一題思路上其實也很簡單&#xff0c;就是一個滑動窗口的思路&#xff0c;遍歷…

前端知識(十三)——JavaScript監聽按鍵,禁止F12,禁止右鍵,禁止保存網頁【Ctrl+s】等操作

禁止右鍵 document.oncontextmenu new Function("event.returnValuefalse;") //禁用右鍵禁止按鍵 // 監聽按鍵 document.onkeydown function () {// f12if (window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode 0…

RNN循環神經網絡python實現

import collections import math import re import random import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2ldef read_txt():# 讀取文本數據with open(./A Study in Drowning.txt, r, encodingutf-8) as f:# 讀取每一行l…

軟件測試之缺陷管理

一、軟件缺陷的基本概念 1、軟件缺陷的基本概念主要分為&#xff1a;缺陷、故障、失效這三種。 &#xff08;1&#xff09;缺陷&#xff08;defect&#xff09;&#xff1a;存在于軟件之中的偏差&#xff0c;可被激活&#xff0c;以靜態的形式存在于軟件內部&#xff0c;相當…

【隱馬爾可夫模型】隱馬爾可夫模型的觀測序列概率計算算法及例題詳解

【隱馬爾可夫模型】用前向算法計算觀測序列概率P&#xff08;O&#xff5c;λ&#xff09;??????? 【隱馬爾可夫模型】用后向算法計算觀測序列概率P&#xff08;O&#xff5c;λ&#xff09; 隱馬爾可夫模型是關于時序的概率模型&#xff0c;描述由一個隱藏的馬爾可夫鏈…

Elbie勒索病毒:最新變種.elbie襲擊了您的計算機?

引言&#xff1a; 在數字時代&#xff0c;.Elbie勒索病毒的威脅越發突出&#xff0c;對個人和組織的數據安全構成了巨大挑戰。本文將深入介紹.Elbie勒索病毒的特征&#xff0c;有效的數據恢復方法&#xff0c;以及一系列預防措施&#xff0c;幫助您更好地保護數字資產。當面對…

線性規劃-單純形法推導

這里寫目錄標題 線性規劃例子啤酒廠問題圖解法 單純形法數學推導將問題標準化并轉為矩陣形式開始推導 實例圖解法單純形法 線性規劃例子 啤酒廠問題 每日銷售上限&#xff1a;100箱啤酒營業時間&#xff1a;14小時生產1箱生啤需1小時生產1箱黑啤需2小時生啤售價&#xff1a;2…

從零開發短視頻電商 AWS OpenSearch Service開發環境申請以及Java客戶端介紹

文章目錄 創建域1.創建域2.輸入配置部署選項數據節點網絡精細訪問控制訪問策略 獲取域端點數據如何插入到OpenSearch ServiceJava連接OpenSearch Servicespring-data-opensearchelasticsearch-rest-high-level-clientopensearch-rest-clientopensearch-java 因為是開發測試使用…

[Linux] nginx的location和rewrite

一、Nginx常用的正則表達式 符號作用^匹配輸入字符串的起始位置$ 匹配輸入字符串的結束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”&#xff0c;但不能匹配“o”?匹配前面的字…

Vue3 setup 頁面跳轉監聽路由變化調整頁面訪問位置

頁面跳轉后頁面還是停留在上一個頁面的位置&#xff0c;沒有回到頂部 解決 1、router中路由守衛中統一添加 router.beforeEach(async (to, from, next) > {window.scrollTo(0, 0);next(); }); 2、頁面中監聽頁面變化 <script setup> import { ref, onMounted, wat…

@Autowired 找不到Bean的問題

排查思路 檢查包掃描&#xff1a;查詢的Bean是否被spring掃描裝配到檢查該Bean上是否配上注解&#xff08;Service/Component/Repository…&#xff09;如果使用第三方&#xff0c;檢查相關依賴是否已經安裝到當前項目 Autowired和Resource的區別 Autowired 是spring提供的注…

圖像清晰度 和像素、分辨率、鏡頭的關系

關于圖像清晰度的幾個知識點分享。 知識點 清晰度 清晰度指影像上各細部影紋及其邊界的清晰程度。清晰度&#xff0c;一般是從錄像機角度出發&#xff0c;通過看重放圖像的清晰程度來比較圖像質量&#xff0c;所以常用清晰度一詞。 而攝像機一般使用分解力一詞來衡量它“分解被…

linux通過命令切換用戶

在Linux中&#xff0c;你可以使用su&#xff08;substitute user或switch user&#xff09;命令來切換用戶。這個命令允許你臨時或永久地以另一個用戶的身份運行命令。以下是基本的用法&#xff1a; 基本切換到另一個用戶&#xff08;需要密碼&#xff09;&#xff1a;su [用戶…

APIFox:打造高效便捷的API管理工具

隨著互聯網技術的不斷發展&#xff0c;API&#xff08;應用程序接口&#xff09;已經成為了企業間數據交互的重要方式。然而&#xff0c;API的管理和維護卻成為了開發者們面臨的一大挑戰。為了解決這一問題&#xff0c;APIFox應運而生&#xff0c;它是一款專為API管理而生的工具…

【力扣100】189.輪轉數組

添加鏈接描述 class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""# 思路&#xff1a;三次數組翻轉nlen(nums)kk%nnums[:] nums[-k:] nums[:-k]思路就是&…

數據科學實踐:探索數據驅動的決策

寫在前面 你是否曾經困擾于如何從海量的數據中提取有價值的信息?你是否想過如何利用數據來指導你的決策,讓你的決策更加科學和精確?如果你有這樣的困擾和疑問,那么你來對了地方。這篇文章將引導你走進數據科學的世界,探索數據驅動的決策。 1.數據科學的基本原則 在我們…

第四屆傳智杯初賽(蓮子的機械動力學)

題目描述 題目背景的問題可以轉化為如下描述&#xff1a; 給定兩個長度分別為 n,m 的整數 a,b&#xff0c;計算它們的和。 但是要注意的是&#xff0c;這里的 a,b 采用了某種特殊的進制表示法。最終的結果也會采用該種表示法。具體而言&#xff0c;從低位往高位數起&#xf…