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.mzph.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;…