LeetCode 第31~33題

目錄

LeetCode 第31題:下一個排列

?LeetCode 第32題:最長有效括號

LeetCode 第33題:搜索旋轉排序數組

LeetCode 第31題:下一個排列

題目描述

整數數組的一個排列就是將所有成員以序列或線性順序排列。例如arr=[1,2,3],以下這些都可以視作arr的排列:[1,2,3],[1,3,2],[3,1,2],[2,3,1]。整數數組的下一個排列是指整數的下一個字典序更大的排列。更正式地,如果數組的所有排列根據其字典順序從小到大排列在一個容器中,那么數組的下一個排列就是在這個有序容器中排在它后面的那個排列。如果不存在下一個更大的排列,那么這個數組必須重排為字典最小的排列(即,其元素按升序排列)。

難度:中等

題目鏈接:31. 下一個排列 - 力扣(LeetCode)

示例1:

輸入:nums = [1,2,3]
輸出:[1,3,2]

?示例2:

輸入:nums = [3,2,1]
輸出:[1,2,3]

示例3:

輸入:nums = [1,1,5]
輸出:[1,5,1]

提示:

  • 1<=nums.length<=100
  • 0<=nums[i]<=100

解題思路:字典序
關鍵點:

  • 從右向左找第一個升序對
  • 從右向左找第一個大于nums[i]的數
  • 交換并反轉后續數字

具體步驟:

  • 從右向左找第一個升序對(i,i+1),找到第一個nums[i]<nums[i+1]的位置,此位置就是需要改變的位置。
  • 從右向左找第一個大于nums[i]的數,在i右側找第一個大于nums[i]的數,與nums[i]交換。
  • 反轉i+1后的所有數字,因為i+1后的數字是降序的,反轉后得到升序。?
public class Solution
{public void NextPermutation(int[] nums){int i=nums.Length-2;//找到第一個升序對while(i>=0 && nums[i]>=nums[i+1])i--;if(i>=0){int j=nums.Length-1;//找到第一個大于nums[i]的數while(j>=0 && nums[j]<=nums[i])j--;Swap(nums,i,j);}Reverse(nums,i+1);//反轉i+1之后的數字}private void Swap(int[] nums,int i ,int j){int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}private void Reverse(int[] nums,int start){int left = start,right=nums.Length-1;while(left<right){Swap(nums,left,right);left++;right--;}}
}
  • 時間復雜度:O(n)
  • 空間復雜度:O(1)

?LeetCode 第32題:最長有效括號

題目描述:
給你一個只包含‘(’和‘)’的字符串,找出最長有效(格式正確且連續)括號子串的長度。

難度:困難
題目鏈接:32. 最長有效括號 - 力扣(LeetCode)

示例1:

輸入:s = "(()"
輸出:2
解釋:最長有效括號子串是 "()"

?示例2:

輸入:s = ")()())"
輸出:4
解釋:最長有效括號子串是 "()()"

示例3:

輸入:s = ""
輸出:0

提示:

  • 0<=s.length<=3*104
  • s[i]為‘(’或‘)’

解題思路:

方法一:動態規劃

關鍵點:

  • 當s[i]為‘(’時,dp[i]=0,因為不可能以左括號結尾
  • 當s[i]為‘)’時,需要考慮兩種情況:
    s[i-1]為‘(’,dp[i]=dp[i-2]+2;s[i-1]為‘)’檢查dp[i-1]前面的字符是否是‘(’
public class Solution
{public int LongestValidParentheses(string s){if(strlen(s)==0) return 0;int maxLen=0,n=strlen(s);int dp[n];for(int i=0;i<n;i++){if(s[i]==')'){if(s[i-1]=='(')  dp[i]=(i>=2 ? dp[i-2]:0)+2;else if(i-dp[i-1]>0 && s[i-dp[i-1]-1]=='(')dp[i] = dp[i-1]+2+(i-dp[i-1]>=2 ? dp[i-dp[i-1]-2]:0);maxLen = Math.Max(maxLen,dp[i]);}}return maxLen;}
}

方法二:雙向掃描法

  • 從左到右掃描,統計左右括號數量
  • 從右向左再次掃描,取兩次掃描的最大值
public class Solution
{public int LongestVaildParentheses(string s){int manLen=0,left=0,right=0;//從左向右掃描for(int i=0;i<s.Length;i++){if(s[i]=='(') left++;else right++;if(left==right)  maxLen=Math.Max(maxLen,2*right);else if(right>left)  left=right=0;}//從右到左掃描left=right=0;for(int i=s.Length-1;i>=0;i--){if(s[i]=='(') left++;else right++;if(left==right)  maxLen=Math.Max(maxLen,2*left)else if(left>right)  left=right=0;}return maxLen;}
}

方法三:棧

  • 使用棧存儲左括號的下標
  • 遇到右括號時嘗試匹配
  • 通過下標差計算長度
public class Solution
{public int LongestVaildParentheses(string s){int maxLen=0,n=strlen(s);int stack[n+1];stack.Push(-1);for(int i=0;i<s.Length;i++){if(s[i]=='(')  stack.Push(i);else {stack.Pop();if(stack.Count==0)  stack.Push(i);else maxLen=fmax(maxLen,i-stack[top]);//返回棧頂的元素但不移除它}}return manLen;    
}
}

LeetCode 第33題:搜索旋轉排序數組

題目描述

整數數組nums按升序排列,數組中的值互不相同。

在傳遞給函數之前,nums在預先未知的某個下標k(0<=k<nums.length)上進行了旋轉,使數組變為【nums[k],nums[k+1],........nums[n-1],nums[0],nums[1],.......nums[k-1]】(下標從0開始計數)。例如【0,1,2,4,5,6,7】在下標3處經旋轉后可能變為【4,5,6,7,0,1,2】。

給你一個旋轉后的數組nums和一個整數target,如果nums中存在這個目標值target,則返回它的下標,否則返回-1。你必須設計一個時間復雜度為O(log n)的算法來解決此問題。

難度:中等

題目鏈接:?33. 搜索旋轉排序數組 - 力扣(LeetCode)

示例1:

輸入:nums = [4,5,6,7,0,1,2], target = 0
輸出:4

?示例2:

輸入:nums = [4,5,6,7,0,1,2], target = 3
輸出:-1

示例3:

輸入:nums = [1], target = 0
輸出:-1

提示:

  • 1<=nums.length<=5000
  • -104<=nums[i]<=104
  • nums中的每個值都獨一無二
  • 題目數據保證nums在預先未知的某個下標上進行了旋轉
  • -104<=target<=104

解題思路:二分查找

public class Solution
{public int Serach(int nums[],int target){if(nums==null || nums.length==0) return -1;int left=0,right=nums.length-1;while(left<=right){int mid= left+right>>1;if(nums[mid]==target)  return mid;if(nums[left]<=nums[mid])//判斷有序部分,二分查找僅限于有序數列中//判斷target是否在有序部分中,如果在縮小范圍到有序部分,否則搜索另一半{if(target>=nums[left] && target<nums[mid]) right=mid-1;else left = mid+1;}else{if(target>nums[mid] && target<=nums[right+1]) left=mid+1;else right = mid-1;}}return -1;}
}

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

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

相關文章

虛擬現實--->unity學習

前言&#xff1a;這學期勞動課選了虛擬現實&#xff0c;其中老師算挺認真的&#xff0c;當然對一些不感興趣的同學來說是一種折磨&#xff0c;我對這個unity的學習以及后續的虛幻引擎剛開始連基礎的概念都沒有&#xff0c;后面漸漸也是滋生了一些興趣&#xff0c;用這篇博客記錄…

在Trae中設置Python解釋器版本

Python 是一種廣泛使用的高級編程語言&#xff0c;因其簡潔易讀的語法和強大的功能而備受歡迎。隨著 Python 的不斷發展&#xff0c;多個版本相繼發布&#xff0c;每個版本都帶來了新特性和改進。然而&#xff0c;這也帶來了一些問題&#xff0c;比如不同的工程&#xff0c;需要…

鴻蒙原生開發之狀態管理V2

一、ArkTS狀態變量的定義&#xff1a; State&#xff1a;狀態&#xff0c;指驅動UI更新的數據。用戶通過觸發組件的事件方法&#xff0c;改變狀態數據。狀態數據的改變&#xff0c;引起UI的重新渲染。 在鴻蒙原生開發中&#xff0c;使用ArkTS開發UI的時候&#xff0c;我們可以…

nginx配置跳轉設置Host有誤導致報404問題

我們有個項目&#xff0c;前端調用了第三方接口。為了避免跨域&#xff0c;所以使用nginx進行轉發。一直正常工作&#xff0c;相安無事。近日第三方調整了安全策略&#xff0c;http轉換成https&#xff0c;原本使用ip&#xff0c;現在也改成使用域名&#xff0c;所以nginx這里我…

深度學習 Deep Learning 第12章 深度學習的主流應用

深度學習 Deep Learning 第12章 深度學習的主流應用 內容概要 本周深入探討了深度學習在多個領域的應用&#xff0c;包括計算機視覺、語音識別、自然語言處理以及其他領域如推薦系統和知識表示。本章強調了硬件和軟件基礎設施的重要性&#xff0c;特別是GPU在加速神經網絡訓練…

【Qt】三種操作sqlite3的方式及其三種多表連接

一、sqlite3與MySQL數據庫區別&#xff1a; 1. 數據庫類型 SQLite3&#xff1a;是嵌入式數據庫&#xff0c;它將整個數據庫存儲在單個文件中&#xff0c;不需要獨立的服務器進程。這意味著它可以很方便地集成到各種應用程序中&#xff0c;如移動應用、桌面應用等。MySQL&…

mysqlworkbench導入.sql文件

1、MySQL Workbench 新建數據庫 或者 在左側導航欄的 ?Schemas 區域右鍵選擇 ?Create Schema...輸入數據庫名稱&#xff08;例如 mydatabase&#xff09;&#xff0c;點擊 ?Apply確認創建&#xff0c;點擊 ?Finish 2、選擇目標數據庫 在左側導航欄的 ?Schemas 列表中&a…

《Spring Cloud Eureka 高可用集群實戰:從零構建高可靠性的微服務注冊中心》

從零構建高可用 Eureka 集群 | Spring Cloud 微服務架構深度實踐指南 本文核心內容基于《Spring Cloud 微服務架構開發》第1版整理&#xff0c;結合生產級實踐經驗優化 實驗環境&#xff1a;IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

實變函數:集合與子集合一例(20250329)

題目 設 r , s , t r, s, t r,s,t 是三個互不相同的數&#xff0c;且 A { r , s , t } A \{r, s, t\} A{r,s,t}, B { r 2 , s 2 , t 2 } B \{r^2, s^2, t^2\} B{r2,s2,t2}, C { r s , s t , r t } C \{rs, st, rt\} C{rs,st,rt} 若 A B C A B C ABC 則 { r , s…

Redis設計與實現-哨兵

哨兵模式 1、啟動并初始化sentinel1.1 初始化服務器1.2 使用Sentinel代碼1.3 初始化sentinel狀態1.4 初始化sentinel狀態的master屬性1.5 創建連向主服務器的網絡連接 2、獲取主服務器信息3、獲取從服務器的信息4、向主從服務器發送信息5、接受主從服務器的頻道信息6、檢測主觀…

藍橋杯省模擬賽 字符串拼接

問題描述 給定四個字符串 a,b,c,d&#xff0c;請將這四個字符串按照任意順序依次連接拼成一個字符串。 請問拼成的字符串字典序最小是多少&#xff1f; 輸入格式 輸入四行&#xff0c;每行包含一個字符串。 輸出格式 輸出一行包含一個字符串&#xff0c;表示答案。 樣例…

【大前端系列20】JavaScript核心:項目實戰從零構建任務管理系統

JavaScript核心&#xff1a;項目實戰從零構建任務管理系統 系列: 「全棧進化&#xff1a;大前端開發完全指南」系列第20篇 核心: 將JavaScript異步編程、事件循環等核心知識應用于實際項目開發 &#x1f4cc; 引言 在前面的文章中&#xff0c;我們深入探討了JavaScript中的異步…

STM32單片機的桌面寵物機器人(基于HAL庫)

效果 基于STM32單片機的桌面寵物機器人 概要 語音模塊&#xff1a;ASR PRO&#xff0c;通過天問block軟件燒錄語音指令 主控芯片&#xff1a;STM32F103C8T6 使用HAL庫 屏幕&#xff1a;0.96寸OLED屏&#xff0c;用來顯示表情 4個舵機&#xff0c;用來當作四只腿 底部一個面…

計算機視覺初步(環境搭建)

1.anaconda 建議安裝在D盤&#xff0c;官網正常安裝即可&#xff0c;一般可以安裝windows版本 安裝成功后&#xff0c;可以在電腦應用里找到&#xff1a; 2.創建虛擬環境 打開anaconda prompt&#xff0c; 可以用conda env list 查看現有的環境&#xff0c;一般打開默認bas…

SQL Server數據庫引擎服務啟動失敗:端口沖突

問題現象&#xff1a; SQL Server 2022 安裝完成后&#xff0c;數據庫引擎服務無法啟動&#xff0c;日志報錯 “TCP 端口 1433 已被占用”&#xff08;ERROR_LOG_SYS_TCP_PORT&#xff09;。 快速診斷 檢測端口占用&#xff1a; # 查看 1433 端口占用情況&#xff08;需管理員權…

全局思維與系統思考

最近接到一些需求&#xff0c;1號位希望每個層級的領導者有眼界&#xff0c;胸懷&#xff0c;格局&#xff0c;全局觀&#xff0c;這些聽起來似乎很抽象&#xff0c;然而它們是每個人、每個團隊成長與成功的核心競爭力。那么&#xff0c;如何才能提升這些能力&#xff1f;就像我…

區間有關的貪心解題記錄435無重疊區間452用最少數量的箭引爆氣球

無重疊區間我的想法是開一個數組a&#xff0c;遍歷給出的區間&#xff0c;在數組a里將對應落在的區間index標記。如果有重復區間就只選擇最小的那個區間標記。但是這道題的區間好像很長-5 * 104 < starti < endi < 5 * 104沒法用數組a表示總的區間范圍。 核心思路是當…

天銳藍盾終端安全防護——企業終端設備安全管控

從辦公室的臺式電腦到員工手中的移動終端&#xff0c;這些設備不僅是工作的得力助手&#xff0c;更是企業數據的重要載體。然而&#xff0c;隨著終端設備的廣泛使用&#xff0c;安全風險也如影隨形。硬件設備使用不當、數據隨意傳輸等問題頻發&#xff0c;使得企業數據面臨著泄…

k8s網絡策略

k8s網絡策略 k8s網絡測試概述查看防火墻策略 k8s網絡策略網絡訪問控制案例&#xff1a;配置k8s網絡策略結果驗證 k8s網絡策略配置示例 k8s網絡測試概述 網絡策略就是設置防火墻 查看防火墻策略 # 獲取當前命名空間下的所有 NetworkPolicy 資源&#xff08;網絡策略&#xff0…

leetcode刷題日記——跳躍游戲 II

[ 題目描述 ]&#xff1a; [ 思路 ]&#xff1a; 題目要求在一個一定能達到數組末尾的跳躍數組中(見55題 跳躍游戲)&#xff0c;找出能夠跳到末尾的最小次數要求次數最少&#xff0c;那肯定是選取能選步數中最大的數。也就是在當前能夠達到的距離中&#xff0c;選擇能夠達到的…