雙指針算法專題之——有效三角形的個數

文章目錄

  • 題目介紹
  • 思路分析
  • AC代碼

題目介紹

鏈接: 611. 有效三角形的個數

在這里插入圖片描述

思路分析

如果判斷三個數能否構成一個三角形,相信大家都知道:

只要任意兩邊之和大于第三邊即可。
比如三條邊長度為a,b,c
那只要滿足
a+b>c
a+c>b
b+c>a

但是,這樣要判斷三個條件,我們來介紹另一種方法:

如果三條邊的長短已經知道:a<=b<=c
那么此時只需滿足較短的兩條邊之和大于最長的那條邊,即
a+b>c
那么它們就一定能構成一個三角形,另外兩個條件就不需要判斷了
原理很簡單,因為c是最大的,c+一個數一定比另外兩條邊還大。

那題目呢,是給定一個包含非負整數的數組 nums ,要返回其中可以組成三角形三條邊的三元組個數。

所以,判斷的時候,我們可以先給數組排個序(升序)

然后呢,我們就可以用雙指針來解決這道題,具體怎么做呢?我們來看一個例子:

給這樣一個數組
在這里插入圖片描述
最大值是10,所以我們先讓固定c為10
那a,b呢?
在這里插入圖片描述
一個指向剩余區間的最大值,一個指向最小值
然后判斷,此時的a+b=11,當然大于10(第一種情況:a+b>c),所以當前這一組是滿足的,可以構成三角形。
然后我們觀察,此時a是最小的,所以此時ab之間的數據都是>=a的,所以中間的這些數據和b相加一定都大于此時的c。
在這里插入圖片描述
一共種呢,就是b的下標-c的下標
在這里插入圖片描述
當前情況下就是5-0=5種。
所以中間的情況就不用判斷了。b=9時一共5種情況可行。
假設兩個指針left和right分別指向ab,那接下來只需讓right--即可,判斷c=10,b=5時候的情況
在這里插入圖片描述
此時a+b<c(第二種情況:a+b<=c
所以構不成三角形,并且,可以斷定此時a和ab之間的數都相加都不大于c,因為這些數都比此時的b(5)小
在這里插入圖片描述
所以固定c為10的情況下,a=2時,跟2 3 4 5都不行(9已經判斷過了)
所以此時讓left++,看后面的行不行(后面的數一定>=2,因為已經排序)
后序也是如此進行判斷。
這一輪結束后(當left>=right結束),固定c為10的情況就計算完了,只需讓c指向9,right從c的前面開始,left還從0下標開始,進重復上述操作,行下一輪的判斷即可。

總結一下:

  1. 先固定c為最大的數
  2. 定義雙指針,按照上述邏輯,判斷出當前情況下符合條件的三元組個數。
    如果a+b>c,b前面的元素個數就是b為當前值的情況下符合條件的三元組個數,然后b往前移(right- -);
    如果a+b<=c,說明a為當前值的情況下找不到滿足條件的,讓a往后移(left++),再重新判斷
  3. 固定c為次大的數,重復上述操作,當c前面的數小于2個,就結束了(即c的下標<2)

AC代碼

在這里插入圖片描述
在這里插入圖片描述

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());int index_c=nums.size()-1;//c的下標int count=0;while(index_c>=2)//index_c<2,此時左邊的數就不夠兩個了{int left=0;//標識a的位置int right=index_c-1;//b的位置while(left<right){if((nums[left]+nums[right])>nums[index_c])      {count+=(right-left);--right;}else++left;}--index_c;}return count;}
};

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

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

相關文章

Linux內核實時機制27 - RT調度器10 - RT throttling 帶寬控制下

文章目錄 1、初始化帶寬 init_rt_bandwidth1.1、init_rt_bandwidth2、定時器處理2.1、sched_rt_period_timer2.2、do_sched_rt_period_timer3、總結1、初始化帶寬 init_rt_bandwidth rt_runtime : 一個時間周期內的運行時間,超過則限流,默認值為0.95ms 1、init_rt_bandwidth…

1.5[hardware][day5]

Link類跳轉指令可以拆分為兩個部分&#xff0c;一個是跳轉&#xff0c;即下一個PC的生成&#xff0c;如果將分支條件的比較放到譯碼級來進行&#xff0c;則這部分只涉及取值級和譯碼級流水&#xff1b;另一個是Link操作&#xff0c;簡單來說就是寫寄存器&#xff0c;這部則主要…

Tomcat 與 Java 環境變量配置簡明教程

Tomcat 與 Java 環境變量配置簡明教程 一、Tomcat 環境變量配置 1. 確認安裝路徑 假設 Tomcat 安裝在&#xff1a;D:\Tomcat\apache-tomcat-9.0.70 2. 設置 CATALINA_HOME 步驟&#xff1a; 右鍵點擊「此電腦」→「屬性」點擊「高級系統設置」→「環境變量」在「系統變量…

3.16學習總結

學習了Java的知識點 基本數據類型 byte占1字節&#xff0c;儲存范圍-128~127 short占2字節&#xff0c;儲存范圍-32768~32767 int占4字節&#xff0c;儲存范圍-2147483648~2147483647 long占8字節&#xff0c;儲存范圍是-9223372036854775808~9223372036854775807 float占…

Android手機中各類安全相關知識總結

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 1. Android 安全威脅2. Android 安全防護措施3. Android 安全建議和最佳實踐4. Android 安全工具推薦5. Android 安全常見問題5.1 如何檢測設備是否感染惡意軟件?5.2 如何防止應用濫用權限?5.3 如何保護設備免受網絡攻…

【Ratis】項目總覽

Apache Ratis 項目源碼分析與運行原理 Apache Ratis 是一個高性能、可擴展的分布式一致性協議實現,是對Raft協議的Java版本的很好的工程實現。它提供了靈活的 API 和多種傳輸層支持(如 gRPC 和 Netty),適用于構建分布式系統中的核心組件,例如分布式存儲、配置管理和服務發…

以太網 MAC 幀格式

文章目錄 以太網 MAC 幀格式以太網幀間隔參考 本文為筆者學習以太網對網上資料歸納整理所做的筆記&#xff0c;文末均附有參考鏈接&#xff0c;如侵權&#xff0c;請聯系刪除。 以太網 MAC 幀格式 以太網技術的正式標準是 IEEE 802.3&#xff0c;它規定了以太網傳輸數據的幀結…

pycharm配置鏡像源【pycharm最新版(23.2.5及以上)方法】

經常遇到pycharm中無法安裝或者安裝慢的問題&#xff0c;糾結了好久&#xff0c;終于找到這個解決辦法了。 為什么要配置鏡像源&#xff1a; 因為Python的包管理工具pip一般從PyPI&#xff08;Python Package Index&#xff09;下載安裝包&#xff0c;但是PyPI位于國外&#x…

駕馭 DeepSeek 科技之翼,翱翔現代學習新天際

在當今這個信息爆炸的時代&#xff0c;學習的方式和途徑正在經歷著前所未有的變革。人工智能技術的飛速發展&#xff0c;為我們的學習帶來了全新的機遇和挑戰。DeepSeek 作為一款強大的大語言模型&#xff0c;憑借其卓越的性能和豐富的功能&#xff0c;為現代學習注入了新的活力…

科普:WOE編碼與One-Hot編碼

WOE編碼是業務邏輯與統計建模的結合&#xff0c;適合強業務導向的場景&#xff1b; One-Hot編碼是數據驅動的特征工程&#xff0c;適合追求模型性能的場景。 編碼方式核心價值典型案例WOE編碼保留變量預測能力&#xff0c;適配線性模型銀行違約預測邏輯回歸One-Hot編碼釋放特征…

Python----數據分析(Pandas一:pandas庫介紹,pandas操作文件讀取和保存)

一、Pandas庫 1.1、概念 Pandas是一個開源的、用于數據處理和分析的Python庫&#xff0c;特別適合處理表格類數 據。它建立在NumPy數組之上&#xff0c;提供了高效的數據結構和數據分析工具&#xff0c;使得數據操作變得更加簡單、便捷和高效。 Pandas 的目標是成為 Python 數據…

Type-C:智能家居的電力革命與空間美學重構

在萬物互聯的時代浪潮中&#xff0c;家居空間正經歷著從功能容器到智慧終端的蛻變。當意大利設計師安東尼奧奇特里奧提出"消失的設計"理念二十年后&#xff0c;Type-C充電技術正以潤物無聲的方式重塑著現代家居的形態與內核&#xff0c;開啟了一場靜默的居住革命。 【…

C++ 左值(lvalue)和右值(rvalue)

在 C 中&#xff0c;左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是指對象的不同類別&#xff0c;區分它們對于理解 C 中的表達式求值和資源管理非常重要&#xff0c;尤其在現代 C 中涉及到移動語義&#xff08;Move Semantics&#xff09;和完美轉…

【含文檔+PPT+源碼】基于SpringBoot和Vue的編程學習系統

項目介紹 本課程演示的是一款 基于SpringBoot和Vue的編程學習系統&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系統 3.該項…

關于新奇的css

background: linear-gradient(154deg, #07070915 30%, hsl(var(--primary) / 30%) 48%, #07070915 64%); filter: blur(100px); background: linear-gradient(154deg, #07070915 30%, hsl(var(--primary) / 30%) 48%, #07070915 64%); 這是一個線性漸變背景設置&#xff0c;角度…

Maxscript如何通過單擊現有按鈕添加新按鈕?

創建一個按鈕,你可以單擊它,然后添加一個新按鈕。 你必須創建一個動態UI,使用maxscript UI元素,將卷展欄構建為字符串,然后評估該字符串并打開新的卷展欄以更新你的UI;使用RolloutCreator(請參閱幫助文件)幫助您構建卷展欄,并打開新的卷展欄以更新您的UI,看下面的示…

Android控件Selector封裝優化指南:高效實現動態UI效果

本文詳細介紹了如何在Android開發中優化selector的封裝&#xff0c;涵蓋Button、TextView、ImageView、CheckBox、RadioButton等常見控件的動態效果實現。通過結合Material Design組件、矢量圖、Ripple效果以及動畫Selector&#xff0c;提供了一套現代化、高性能的解決方案&…

pytest+allure+jenkins

本地運行參考&#xff1a;pytestallure 入門-CSDN博客 jenkins運行如下&#xff1a; 安裝插件&#xff1a;allure 配置allure安裝目錄 配置pytest、allure 環境變量 配置流水線 進行build,結果如下 ,點擊allure report 查看結果

C#核心筆記——(五)框架概述

.NET Ftamework中幾乎所有功能都是通過大量的托管類型提供的。這些類型組織在層次化的命名空間中&#xff0c;并打包為一套程序集&#xff0c;與CLR一起構成了.NET平臺。 有些.NET類型是由CLR直接使用的&#xff0c;且對于托管宿主環境而言是必不可少的。這些類型位于一個名為…

phpstudy+phpstorm+xdebug【學習筆記】

配置PHPStudy 配置PHPSTORM phpstorm選擇PHP版本 配置DEBUG 設置服務器 編輯配置 學習參考鏈接&#xff1a;&#xff1a;https://blog.csdn.net/m0_60571842/article/details/133246064