Android學習總結之算法篇六(數組和棧)

括號匹配

public static boolean isValid(String s) {// 創建一個棧用于存儲左括號Stack<Character> stack = new Stack<>();// 遍歷字符串中的每個字符for (char c : s.toCharArray()) {if (c == '(' || c == '[' || c == '{') {// 如果是左括號,將其壓入棧中stack.push(c);} else {if (stack.isEmpty()) {// 如果棧為空,說明沒有匹配的左括號,返回 falsereturn false;}// 彈出棧頂元素char top = stack.pop();if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {// 如果右括號與棧頂的左括號不匹配,返回 falsereturn false;}}}// 如果棧為空,說明所有括號都匹配,返回 truereturn stack.isEmpty();}

子數組最大和

/*** 計算子數組的最大和* @param nums 整數數組* @return 子數組的最大和*/public static int maxSubArray(int[] nums) {// 當前子數組的最大和int currentMax = nums[0];// 全局子數組的最大和int globalMax = nums[0];// 從數組的第二個元素開始遍歷for (int i = 1; i < nums.length; i++) {// 更新當前子數組的最大和currentMax = Math.max(nums[i], currentMax + nums[i]);// 更新全局子數組的最大和globalMax = Math.max(globalMax, currentMax);}return globalMax;}

循環升序數組最小值

public class FindMinInRotatedSortedArray {// 此方法用于在循環升序數組中查找最小值public static int findMin(int[] nums) {// 初始化左指針,指向數組起始位置int left = 0;// 初始化右指針,指向數組末尾位置int right = nums.length - 1;// 當左指針小于右指針時,繼續循環查找while (left < right) {// 計算中間位置,使用 left + (right - left) / 2 避免整數溢出int mid = left + (right - left) / 2;// 如果中間元素大于右邊界元素,說明最小值在 mid 右側if (nums[mid] > nums[right]) {// 更新左指針到 mid + 1 位置left = mid + 1;} else {// 否則,最小值在 mid 或 mid 左側,更新右指針到 mid 位置right = mid;}}// 當 left 和 right 相遇時,該位置的元素即為最小值return nums[left];}public static void main(String[] args) {// 定義一個示例循環升序數組int[] nums = {3, 4, 5, 1, 2};// 調用 findMin 方法查找最小值并打印結果System.out.println("數組中的最小值是: " + findMin(nums));}
}    

字符串解碼

class Solution {// 該方法用于對輸入的編碼字符串進行解碼public String decodeString(String s) {// 用于存儲重復次數的棧Stack<Integer> countStack = new Stack<>();// 用于存儲待拼接的字符串的棧Stack<String> stringStack = new Stack<>();// 用于構建當前正在處理的字符串StringBuilder currentString = new StringBuilder();// 用于記錄當前的重復次數int k = 0;// 遍歷輸入字符串中的每一個字符for (char c : s.toCharArray()) {// 如果當前字符是數字if (Character.isDigit(c)) {// 更新重復次數 k,考慮到多位數的情況k = k * 10 + (c - '0');// 如果當前字符是左括號 [} else if (c == '[') {// 將當前的重復次數 k 壓入 countStack 棧中countStack.push(k);// 將當前已經構建好的字符串壓入 stringStack 棧中stringStack.push(currentString.toString());// 清空 currentString,準備處理括號內的字符串currentString = new StringBuilder();// 重置重復次數 k 為 0k = 0;// 如果當前字符是右括號 ]} else if (c == ']') {// 從 stringStack 棧中彈出上一個字符串StringBuilder decodeString = new StringBuilder(stringStack.pop());// 從 countStack 棧中彈出重復次數int count = countStack.pop();// 根據重復次數,將當前括號內的字符串添加到 decodeString 后面for (int i = 0; i < count; i++) {decodeString.append(currentString);}// 更新 currentString 為 decodeStringcurrentString = decodeString;// 如果當前字符是普通字符} else {// 將該字符添加到 currentString 后面currentString.append(c);}}// 返回最終解碼后的字符串return currentString.toString();}
}

合并區間

class Solution {public static int[][] merge(int[][] intervals) {// 如果輸入數組為空或者長度為 0,直接返回空數組if (intervals == null || intervals.length == 0) {return new int[0][0];}// 按照區間的起始位置進行排序Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));// 用于存儲合并后的區間List<int[]> merged = new ArrayList<>();// 取第一個區間作為初始的合并區間int[] current = intervals[0];// 遍歷剩余的區間for (int i = 1; i < intervals.length; i++) {int[] interval = intervals[i];// 如果當前區間的結束位置大于等于下一個區間的起始位置,說明有重疊if (current[1] >= interval[0]) {// 更新當前區間的結束位置為兩個區間結束位置的最大值current[1] = Math.max(current[1], interval[1]);} else {// 沒有重疊,將當前區間加入到合并列表中merged.add(current);// 更新當前區間為下一個區間current = interval;}}// 將最后一個合并的區間加入到列表中merged.add(current);// 將列表轉換為二維數組并返回return merged.toArray(new int[merged.size()][]);}
}

合并兩個有序數組

假設有兩個有序數組?nums1?和?nums2,要將?nums2?合并到?nums1?中,使?nums1?成為一個有序數組。nums1?的長度足以容納?nums2?的元素。

class Solution {// 該方法用于將 nums2 合并到 nums1 中,使 nums1 成為一個有序數組public void merge(int[] nums1, int m, int[] nums2, int n) {// p1 指向 nums1 中有效元素的最后一個位置int p1 = m - 1;// p2 指向 nums2 中最后一個元素的位置int p2 = n - 1;// p 指向合并后數組的最后一個位置int p = m + n - 1;// 當 p1 和 p2 都未越界時,進行比較和賦值操作while (p1 >= 0 && p2 >= 0) {// 如果 nums1[p1] 大于 nums2[p2]if (nums1[p1] > nums2[p2]) {// 將 nums1[p1] 放到合并后數組的 p 位置nums1[p] = nums1[p1];// p1 指針左移一位p1--;} else {// 否則將 nums2[p2] 放到合并后數組的 p 位置nums1[p] = nums2[p2];// p2 指針左移一位p2--;}// p 指針左移一位p--;}// 如果 nums2 中還有剩余元素,將其依次放入 nums1 中while (p2 >= 0) {nums1[p] = nums2[p2];p2--;p--;}}
}    

合并K個有序數組

import java.util.PriorityQueue;class Solution {// 該方法用于合并多個有序數組public int[] mergeKArrays(int[][] arrays) {// 如果輸入的數組為空或者長度為 0,直接返回一個空數組if (arrays == null || arrays.length == 0) {return new int[0];}// 創建一個最小堆,用于存儲每個數組的當前最小值PriorityQueue<Node> minHeap = new PriorityQueue<>((a, b) -> a.val - b.val);// 計算所有數組的總長度int totalLength = 0;// 遍歷每個數組for (int i = 0; i < arrays.length; i++) {// 如果當前數組不為空if (arrays[i].length > 0) {// 將當前數組的第一個元素及其所在數組的索引和位置信息封裝成 Node 放入最小堆中minHeap.offer(new Node(arrays[i][0], i, 0));// 累加當前數組的長度到總長度中totalLength += arrays[i].length;}}// 創建一個用于存儲合并后結果的數組int[] result = new int[totalLength];// 結果數組的索引int index = 0;// 當最小堆不為空時,繼續合并操作while (!minHeap.isEmpty()) {// 從最小堆中取出當前最小值對應的 NodeNode node = minHeap.poll();// 將該最小值放入結果數組中result[index++] = node.val;// 如果該元素所在數組還有剩余元素if (node.col + 1 < arrays[node.row].length) {// 將該數組的下一個元素及其位置信息封裝成 Node 放入最小堆中minHeap.offer(new Node(arrays[node.row][node.col + 1], node.row, node.col + 1));}}// 返回合并后的結果數組return result;}// 自定義 Node 類,用于存儲元素的值、所在數組的索引和元素在數組中的位置static class Node {int val;int row;int col;// 構造函數,用于初始化 Node 對象Node(int val, int row, int col) {this.val = val;this.row = row;this.col = col;}}
}    

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

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

相關文章

遺傳算法(Genetic Algorithm,GA)

遺傳算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一種受生物進化理論啟發的優化算法&#xff0c;通過模擬自然選擇和遺傳機制來搜索復雜問題的最優解。 ??核心原理?? ??自然選擇與適者生存??&#xff1a;適應度高的個體更有可能繁殖&#xff0c;將…

消防應急物資智能調用立庫:豪越科技助力消防“速戰速決”

在消防救援的戰場上&#xff0c;時間就是生命&#xff0c;每一秒都關乎著人民群眾的生命財產安全。然而&#xff0c;在過去的緊急救援中&#xff0c;應急物資無法及時到位的情況時有發生&#xff0c;成為制約救援效率的關鍵難題&#xff0c;給救援工作帶來了巨大的困境。 想象一…

【MySQL】數據類型和表的操作

目錄 一. 常用的數據類型 1.數值類型 1.1 整形類型 1.2 浮點型類型 2.字符串類型 char和varchar的區別 如何選擇char和varchar 3.日期類型 4.二進制類型 二. 表的操作 1.查看所有表 2.表的創建 3.查看表的結構 4.表的修改 4.1 添加新的列 4.2 修改表中現有的列 4…

漲薪技術|0到1學會性能測試第43課-apache status模塊監控

前面的推文我們認識了apache目錄結構與配置知識,今天我們繼續來看下apache監控技術,究竟是怎么做性能監控的。后續文章都會系統分享干貨,帶大家從0到1學會性能測試。 Apache監控技術 關于apache監控通常會有兩種方法: 一是:使用apache自帶的status監控模塊進行監控; 二是…

關于 MCP 的理論知識學習

文章目錄 1. 寫在最前面2. 基本概念2.1 Why MCP2.1.1 大模型訪問的局限2.1.2 過渡階段—Function Call2.1.3 當前階段— MCP 3. 碎碎念4. 參考資料 1. 寫在最前面 最近有一項任務是寫舊版本遷移到新版本的支持文檔&#xff0c;文檔的編寫是借助于 cursor 幫忙寫的。但是實現的…

C++學習之路,從0到精通的征途:List類的模擬實現

目錄 一.list的介紹 二.list的接口實現 1.結點 2.list結構 3.迭代器 &#xff08;1&#xff09;begin &#xff08;2&#xff09;end 4.修改 &#xff08;1&#xff09;insert &#xff08;2&#xff09;push_back &#xff08;3&#xff09;push_front &#xff0…

【游戲ai】從強化學習開始自學游戲ai-2 使用IPPO自博弈對抗pongv3環境

文章目錄 前言一、環境設計二、動作設計三、狀態設計四、神經網路設計五、效果展示其他問題總結 前言 本學期的大作業&#xff0c;要求完成多智能體PPO的乒乓球對抗環境&#xff0c;這里我使用IPPO的方法來實現。 正好之前做過這個單個PPO與pong環境內置的ai對抗的訓練&#…

計算機考研精煉 操作系統

第 14 章 操作系統概述 14.1 基本概念 14.1.1 操作系統的基本概念 如圖 14 - 1 所示&#xff0c;操作系統是計算機系統中的一個重要組成部分&#xff0c;它位于計算機硬件和用戶程序&#xff08;用戶&#xff09;之間&#xff0c;負責管理計算機的硬件資源&#xff0c;為用戶和…

什么是基爾霍夫第一定律

基爾霍夫第一定律&#xff08;Kirchhoffs First Law&#xff09;&#xff0c;也稱為基爾霍夫電流定律&#xff08;Kirchhoffs Current Law&#xff0c;簡稱 KCL&#xff09;&#xff0c;是電路分析中最基礎的定律之一。它描述了電路中電流的守恒特性&#xff0c;適用于任何集總…

解決 RN Switch 組件在安卓端樣式很丑的問題

解決此種問題的方式有很多 可以導入原生庫react-native-switch 切圖 (會缺少動畫) 使用 js 組件 這里使用 js 繪制組件&#xff08;原生體驗&#xff09;解決此類問題 Switch.tsx import React, { useEffect, useRef, useState } from react; import { Animated, Pressabl…

【AI】【MCP】搭建私人王炸MCP自動化工作流

目錄 一、什么是MCP 二、MCP大集合 三、準備工作 3.1 安裝node.js 3.2 安裝vscode 3.3 安裝cline插件 3.3.1 安裝 3.3.2 配置Cline 四、配置MCP服務 4.1 Search-mcp服務 4.2 playwright-mcp 服務 前言&#xff1a;夢想組合&#xff0c;輕松辦公&#xff0c;告別手動&a…

Git 實操:如何使用交互式 Rebase 移除指定提交(真實案例分享)

在日常開發中&#xff0c;有時候我們提交了一些不想保留的記錄&#xff0c;比如測試代碼、錯誤的功能提交等。 ?? 在操作 4. 強制推送到遠程倉庫前的注意事項 強制推送&#xff08;git push --force 或 git push -f&#xff09;確實很強大但也危險&#xff0c;因為它會重寫…

11.Excel:函數

一 函數是什么 函數是定義好的公式。 單元格內輸入sum然后tab&#xff0c;框選要求和的范圍&#xff0c;然后回車鍵。 補充&#xff1a;公式。 公式以開頭&#xff0c;可以用于計算&#xff0c;返回數值。 分別點擊各個數值&#xff0c;中間用加號連接。這樣很不方便&#xff…

Springboot使用ThreadLocal提供線程局部變量,傳遞登錄用戶名

文章目錄 概述使用創建ThreadLocalUtil工具類在登錄攔截器中使用ThreadLocal存儲登錄用戶名在/userInfo接口中獲取登錄用戶名 注意事項參考視頻 概述 使用 創建ThreadLocalUtil工具類 utils/ThreadLocalUtil.java package org.example.utils;/*** ThreadLocal 工具類*/ Supp…

1399. 統計最大組的數目

1399. 統計最大組的數目 題目鏈接&#xff1a;1399. 統計最大組的數目 代碼如下&#xff1a; class Solution { public:int countLargestGroup(int n) {int res 0;unordered_map<int, int> um;int maxValue 0;for (int i 1;i < n;i) {string value to_string(i);…

VS Code 插件Git History Diff 使用

右上角 查看單個文件記錄

數學建模論文手的學習日常01

目錄 一.要寫的內容&#xff1a; 二.文章標題&#xff1a; 三.摘要&#xff08;非常非常非常重要&#xff09; 四、關鍵詞&#xff1a; 五、問題重述 六、模型假設 七、符號說明 八、模型的建立與求解 九、模型的分析與檢驗 十、模型的評價、改進與推廣 十一、參考…

深度學習: AI 體育領域

一、引言 在科技與體育深度融合的當下&#xff0c;AI 體育逐漸成為推動體育行業變革的重要力量。深度學習憑借其強大的數據分析與模式識別能力&#xff0c;為 AI 體育帶來了全新的發展機遇。從運動員動作分析到智能健身指導&#xff0c;從賽事預測到運動康復輔助&#xff0c;深…

在 Ubuntu24.04 LTS 上 Docker 部署英文版 n8n 和 部署中文版 n8n-i18n-chinese

一、n8n 簡介 n8n 是一個低代碼&#xff08;Low-Code&#xff09;工作流自動化平臺&#xff0c;可以幫助用戶以非常簡單的方式創建自動化流程&#xff0c;連接不同的應用程序和服務。n8n的設計理念是為了讓復雜的工作流變得簡單易用&#xff0c;同時也支持高度的自定義&#xf…

《系統分析師-第三階段—總結(八)》

背景 采用三遍讀書法進行閱讀&#xff0c;此階段是第三遍。 過程 本篇總結第15章的內容 第15章 總結 系統運行與維護&#xff0c;系統經過測試交付之后&#xff0c;進入運行維護階段&#xff0c;維護分為系統運行、故障維護、系統評價和系統相關的策略。 疑問&#xff1a;…