Java每日一练(20230319)
目录
1. 最大矩形 🌟🌟🌟
2. 回文对 🌟🌟🌟
3. 给表达式添加运算符 🌟🌟🌟
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
1. 最大矩形
给定一个仅包含 0
和 1
、大小为 rows x cols
的二维二进制矩阵,找出只包含 1
的最大矩形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] 输出:6 解释:最大矩形如上图所示。
示例 2:
输入:matrix = [] 输出:0
示例 3:
输入:matrix = [["0"]] 输出:0
示例 4:
输入:matrix = [["1"]] 输出:1
示例 5:
输入:matrix = [["0","0"]] 输出:0
提示:
rows == matrix.length
cols == matrix[0].length
0 <= row, cols <= 200
matrix[i][j]
为'0'
或'1'
出处:
https://edu.csdn.net/practice/23165386
代码:
import java.util.List;
import java.util.Arrays;
public class maxRectangle {public static class Solution {public int maximalRectangle(char[][] matrix) {if (matrix == null || matrix.length == 0)return 0;int m = matrix.length;int n = matrix[0].length;int[] left = new int[n];int[] right = new int[n];int[] height = new int[n];Arrays.fill(right, n);int cur_left = 0;int cur_right = n;int res = 0;for (int i = 0; i < m; i++) {cur_left = 0;cur_right = n;for (int j = 0; j < n; j++) {if (matrix[i][j] == '1')height[j]++;elseheight[j] = 0;}for (int j = 0; j < n; j++) {if (matrix[i][j] == '1') {left[j] = Math.max(left[j], cur_left);} else {left[j] = 0;cur_left = j + 1;}}for (int j = n - 1; j >= 0; j--) {if (matrix[i][j] == '1') {right[j] = Math.min(right[j], cur_right);} else {right[j] = n;cur_right = j;}}for (int j = 0; j < n; j++)res = Math.max(res, (right[j] - left[j]) * height[j]);}return res;}}public static void main(String[] args) {Solution s = new Solution();char[][] matrix = {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},{'1','0','0','1','0'}};System.out.println(s.maximalRectangle(matrix));}
}
输出:
6
import java.util.Deque;
import java.util.LinkedList;
public class maxRectangle {public static class Solution {public int maximalRectangle(char[][] matrix) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return 0;}int m = matrix.length, n = matrix[0].length;int[] heights = new int[n];int ans = 0;for (int i = 0; i < m; ++i) {// 更新高度数组for (int j = 0; j < n; ++j) {if (matrix[i][j] == '1') {heights[j] += 1;} else {heights[j] = 0;}}// 计算最大矩形面积ans = Math.max(ans, largestRectangleArea(heights));}return ans;}private int largestRectangleArea(int[] heights) {int n = heights.length;int[] left = new int[n];int[] right = new int[n];Deque<Integer> stack = new LinkedList<>();// 计算 left 数组for (int i = 0; i < n; ++i) {while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {stack.pop();}left[i] = stack.isEmpty() ? -1 : stack.peek();stack.push(i);}stack.clear();// 计算 right 数组for (int i = n - 1; i >= 0; --i) {while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {stack.pop();}right[i] = stack.isEmpty() ? n : stack.peek();stack.push(i);}// 计算最大矩形面积int ans = 0;for (int i = 0; i < n; ++i) {ans = Math.max(ans, heights[i] * (right[i] - left[i] - 1));}return ans;}}public static void main(String[] args) {Solution s = new Solution();char[][] matrix = {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},{'1','0','0','1','0'}};System.out.println(s.maximalRectangle(matrix));}
}
用一个一维数组 heights 来记录当前行中以每个元素为底的最大连续 1 的个数。
然后,对每一行都计算其最大矩形面积,并更新答案。
计算最大矩形面积的算法如下:
定义一个栈 stack 和两个数组 left 和 right,其中 left[i] 表示第 i 个元素左边第一个小于它的元素的下标,right[i] 表示第 i 个元素右边第一个小于它的元素的下标;
1. 从左到右遍历 heights 数组,对每个元素 heights[i],执行以下操作:
如果栈为空或者栈顶元素对应的高度小于等于当前元素的高度,则将当前元素的下标入栈;
否则,弹出栈顶元素,更新 left[i] 为栈顶元素的下标,直到栈为空或者栈顶元素对应的高度小于当前元素的高度,然后将当前元素的下标入栈;
2. 从右到左遍历 heights 数组,对每个元素 heights[i],执行以下操作:
如果栈为空或者栈顶元素对应的高度小于等于当前元素的高度,则将当前元素的下标入栈;
否则,弹出栈顶元素,更新 right[i] 为栈顶元素的下标,直到栈为空或者栈顶元素对应的高度小于当前元素的高度,然后将当前元素的下标入栈;
3. 最后,遍历 heights 数组,计算每个元素对应的最大矩形面积 heights[i] * (right[i] - left[i] - 1),并更新答案; 返回答案。
2. 回文对
给定一组 互不相同 的单词, 找出所有 不同 的索引对 (i, j)
,使得列表中的两个单词, words[i] + words[j]
,可拼接成回文串。
示例 1:
输入:words = ["abcd","dcba","lls","s","sssll"]
输出:[[0,1],[1,0],[3,2],[2,4]]
解释:可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]
示例 2:
输入:words = ["bat","tab","cat"]
输出:[[0,1],[1,0]]
解释:可拼接成的回文串为 ["battab","tabbat"]
示例 3:
输入:words = ["a",""] 输出:[[0,1],[1,0]]
提示:
1 <= words.length <= 5000
0 <= words[i].length <= 300
words[i]
由小写英文字母组成
出处:
https://edu.csdn.net/practice/23165387
代码1:
import java.util.*;
public class palindromePairs {public static class Solution {private static List<List<Integer>> ans = new ArrayList<>();public List<List<Integer>> palindromePairs(String[] words) {if (words == null || words.length == 0) {return null;}ans = new ArrayList<>();TrieNode root = new TrieNode();for (int i = 0; i < words.length; i++) {addWord(root, words[i], i);}for (int i = 0; i < words.length; i++) {find(root, words[i], i);}return ans;}private static class TrieNode {int index;TrieNode[] next;List<Integer> palindIndex;public TrieNode() {index = -1;next = new TrieNode[26];palindIndex = new ArrayList<>();}}private static void addWord(TrieNode root, String word, int index) {for (int i = word.length() - 1; i >= 0; i--) {int ch = word.charAt(i) - 'a';if (root.next[ch] == null) {root.next[ch] = new TrieNode();}if (isPalindrome(word, 0, i)) {root.palindIndex.add(index);}root = root.next[ch];}root.index = index;root.palindIndex.add(index);}private static void find(TrieNode root, String word, int index) {for (int i = 0; i < word.length(); i++) {if (root.index != -1 && root.index != index && isPalindrome(word, i, word.length() - 1)) {ans.add(Arrays.asList(index, root.index));}if (root.next[word.charAt(i) - 'a'] == null) {return;}root = root.next[word.charAt(i) - 'a'];}for (int i : root.palindIndex) {if (i != index) {ans.add(Arrays.asList(index, i));}}}private static boolean isPalindrome(String string, int l, int r) {while (l < r) {if (string.charAt(l++) != string.charAt(r--)) {return false;}}return true;}}public static void main(String[] args) {Solution s = new Solution();String[] words = {"abcd","dcba","lls","s","sssll"};System.out.println(s.palindromePairs(words));String[] words1 = {"bat","tab","cat"};System.out.println(s.palindromePairs(words1));String[] words2 = {"a",""};System.out.println(s.palindromePairs(words2));}
}
输出:
[[0, 1], [1, 0], [2, 4], [3, 2]]
[[0, 1], [1, 0]]
[[0, 1], [1, 0]]
代码2:
思路:遍历单词列表,对于每个单词,将其拆分成左右两个部分,如果左边是回文串,那么找右边的逆序单词是否在单词列表中,如果在,则说明当前单词可以和右边的逆序单词拼接成回文串。同理,如果右边是回文串,那么找左边的逆序单词是否在单词列表中。
import java.util.*;
public class palindromePairs {public static class Solution {public List<List> palindromePairs(String[] words) {List<List> res = new ArrayList<>();if (words == null || words.length < 2) return res;Map<String, Integer> map = new HashMap<>();for (int i = 0; i < words.length; i++) {map.put(words[i], i);}for (int i = 0; i < words.length; i++) {String word = words[i];for (int j = 0; j <= word.length(); j++) {String left = word.substring(0, j);String right = word.substring(j);if (isPalindrome(left)) {String reverseRight = new StringBuilder(right).reverse().toString();if (map.containsKey(reverseRight) && map.get(reverseRight) != i) {res.add(Arrays.asList(map.get(reverseRight), i));}}if (isPalindrome(right)) {String reverseLeft = new StringBuilder(left).reverse().toString();if (map.containsKey(reverseLeft) && map.get(reverseLeft) != i && right.length() != 0) {res.add(Arrays.asList(i, map.get(reverseLeft)));}}}}return res;}private boolean isPalindrome(String s) {int left = 0, right = s.length() - 1;while (left < right) {if (s.charAt(left) != s.charAt(right)) {return false;}left++;right--;}return true;}}public static void main(String[] args) {Solution s = new Solution();String[] words = {"abcd","dcba","lls","s","sssll"};System.out.println(s.palindromePairs(words));String[] words1 = {"bat","tab","cat"};System.out.println(s.palindromePairs(words1));String[] words2 = {"a",""};System.out.println(s.palindromePairs(words2));}
}
输出:
[[1, 0], [0, 1], [3, 2], [2, 4]]
[[1, 0], [0, 1]]
[[0, 1], [1, 0]]
3. 给表达式添加运算符
给定一个仅包含数字 0-9
的字符串 num
和一个目标值整数 target
,在 num
的数字之间添加 二元 运算符(不是一元)+
、-
或 *
,返回所有能够得到目标值的表达式。
示例 1:
输入: num = "123", target = 6 输出: ["1+2+3", "1*2*3"]
示例 2:
输入: num = "232", target = 8 输出: ["2*3+2", "2+3*2"]
示例 3:
输入: num = "105", target = 5 输出: ["1*0+5","10-5"]
示例 4:
输入: num = "00", target = 0 输出: ["0+0", "0-0", "0*0"]
示例 5:
输入: num = "3456237490", target = 9191 输出: []
提示:
1 <= num.length <= 10
num
仅含数字-2^31 <= target <= 2^31 - 1
出处:
https://edu.csdn.net/practice/23165388
代码1:
import java.util.*;
public class addOperators {public static class Solution {int n;String num;List<String> ans;int target;public List<String> addOperators(String num, int target) {this.n = num.length();this.num = num;this.target = target;this.ans = new ArrayList<String>();StringBuffer expr = new StringBuffer();dfs(expr, 0, 0, 0);return ans;}private void dfs(StringBuffer sba, long sum, long prepareMultiply, int index) {StringBuffer sb = new StringBuffer(sba);if (index == n) {if (sum == target) {ans.add(sb.toString());}return;}int sign = sb.length();if (index > 0) {sb.append("0");}long val = 0;for (int i = index; i < n && (i == index || num.charAt(index) != '0'); i++) {val = val * 10 + (num.charAt(i) - '0');sb.append(num.charAt(i));if (index == 0) {dfs(sb, val, val, i + 1);continue;}sb.setCharAt(sign, '+');dfs(sb, sum + val, val, i + 1);sb.setCharAt(sign, '-');dfs(sb, sum - val, -val, i + 1);sb.setCharAt(sign, '*');dfs(sb, sum - prepareMultiply + prepareMultiply * val, prepareMultiply * val, i + 1);}}}public static void main(String[] args) {Solution s = new Solution();s.num = "123";s.target = 6;System.out.println(s.addOperators(s.num, s.target));s.num = "232";s.target = 8;System.out.println(s.addOperators(s.num, s.target));s.num = "105";s.target = 5;System.out.println(s.addOperators(s.num, s.target));}
}
输出:
[1+2+3, 1*2*3]
[2+3*2, 2*3+2]
[1*0+5, 10-5]
代码2:
import java.util.*;
public class addOperators {public static class Solution {int n;String num;List<String> ans;int target;public List<String> addOperators(String num, int target) {List<String> res = new ArrayList<>();if (num == null || num.length() == 0) {return res;}dfs(num, target, "", 0, 0, 0, res);return res;}private void dfs(String num, int target, String path, int pos, long eval, long multed, List<String> res) {if (pos == num.length()) {if (eval == target) {res.add(path);}return;}for (int i = pos; i < num.length(); i++) {if (i != pos && num.charAt(pos) == '0') {break;}long cur = Long.parseLong(num.substring(pos, i + 1));if (pos == 0) {dfs(num, target, path + cur, i + 1, cur, cur, res);} else {dfs(num, target, path + "+" + cur, i + 1, eval + cur, cur, res);dfs(num, target, path + "-" + cur, i + 1, eval - cur, -cur, res);dfs(num, target, path + "*" + cur, i + 1, eval - multed + multed * cur, multed * cur, res);}}}}public static void main(String[] args) {Solution s = new Solution();System.out.println(s.addOperators("123", 6));System.out.println(s.addOperators("232", 8));System.out.println(s.addOperators("105", 5));}
}
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
![]() | Golang每日一练 专栏 |
![]() | Python每日一练 专栏 |
![]() | C/C++每日一练 专栏 |
![]() | Java每日一练 专栏 |
相关文章:

Java每日一练(20230319)
目录 1. 最大矩形 🌟🌟🌟 2. 回文对 🌟🌟🌟 3. 给表达式添加运算符 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练…...

Redis缓存双写一致性
目录双写一致性Redis与Mysql双写一致性canal配置流程代码案例双写一致性理解缓存操作细分缓存一致性多种更新策略挂牌报错,凌晨升级先更新数据库,在更新缓存先删除缓存,在更新数据库先更新数据库,在删除缓存延迟双删策略总结双写一致性 Redis与Mysql双写一致性 canal 主要是…...

【2023-Pytorch-检测教程】手把手教你使用YOLOV5做交通标志检测
项目下载地址:YOLOV5交通标志识别检测数据集代码模型教学视频-深度学习文档类资源-CSDN文库 交通标志的目标检测算法在计算机视觉领域一直属于热点研究问题,改进的优化算法不断地被提出。国内外许多学者针对现有的目标检测方法中网络结构、目标定位、损…...

Java中的二叉树
文章目录前言一、树形结构(了解)1.1 概念1.2 概念(重要)1.3 树的表示形式(了解)1.4 树的应用二、二叉树(重点)2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.5 二叉树的存储2.5 二…...

基于 gma 绘制古代洛阳 5 大都城遗址空间分布地图
了解 gma gma 是什么? gma 是一个基于 Python 的地理、气象数据快速处理和数据分析函数包(Geographic and Meteorological Analysis,gma)。gma 网站:地理与气象分析库。 gma 的主要功能有哪些? 气候气象&a…...

分析 Spring 的依赖注入模式
一、依赖注入二、Field Injection优点缺点三、Constructor Injection优点1. 容易发现 code smell优点2. 容易厘清依赖关系优点3. 容易写单元测试优点4. Immutable Object缺点:循环依赖四、总结一、依赖注入 依赖注入 (Dependency Injection,…...

IntelliJ IDEA创建Servlet
目录 ——————————————————————————————— 一、创建Java项目 1、创建java项目 2、选择java 3、next 4、给项目命名 5、新创建完java项目的目录结构 二、变java为servlet项目 1、变servlet项目 2、选择Web Application 3、更新完成后的目录…...

Spring Boot如何让自己的bean优先加载
背景介绍 在一些需求中,可能存在某些场景,比如先加载自己的bean,然后自己的bean做一些DB操作,初始化配置问题,然后后面的bean基于这个配置文件,继续做其他的业务逻辑。因此有了本文的这个题目。 实现方法…...

LeetCode分类刷题----动态规划
动态规划509.斐波那契数列70.爬楼梯746.使用最小花费怕楼梯62.不同路径63.不同路径||343.整数拆分96.不同的二叉搜索树01背包问题416.分割等和子集1049.最后一块石头的重量||494.目标和474.一和零完全背包问题518.零钱兑换||377.组合总和IV322.零钱兑换279.完全平方数139.单词拆…...

今年好像没有金三银四了?
大家好,我是记得诚。 金三银四,是换工作的高峰期,新的一年结束了,在年前拿完年终奖,在年后3月和4月换个满意的工作。 单从我公司来看,目前还没有一个人离职,往年离职率是要高一些的。 还有我…...

【C++】入门知识之 函数重载
前言提到重载这个词,我们会想到什么呢?重载有一种一词多义的意思,中华文化博大精深,之前有一个笑话,中国的乒乓球谁都打不过,男足谁都打不过,哈哈哈这也是非常有意思的,但是今天我们…...

文心一言发布,你怎么看?chatGPT
百度全新一代知识增强大语言模型“文心一言”于2021年3月16日正式发布,作为一款自然语言处理技术,它引起了广泛的关注和讨论。 首先,文心一言是一款具有重大意义的自然语言处理技术。在人工智能领域,自然语言处理技术一直是一个难…...

字符函数和字符串函数【上篇】
文章目录🎖️1.函数介绍📬1.1. strlen📬1.2. strcpy📬1.3. strcat📬1.4. strcmp📬1.5. strncpy📬1.6. strncat📬1.7. strncmp🎖️1.函数介绍 📬1.1. strlen …...

list的模拟实现(模仿STL)
目录 一、模拟实现前的准备 1.list结构认识 2.迭代器的实现不同 3.如何实现需要的功能 二.结点类实现 三.迭代器实现 1.实现前的问题 2._list_iterator类的成员变量和构造函数 3.*和->运算符重载 4.前置和后置的实现 5.前置--和后置-- 6.和!运算符重载 四.list类的实现 1.li…...

05-STM32F1 - 串行通信SPI
SPI STM-SPI作为主机,从机 SPI的时钟,最高为Pclk/2,SPI1最高为36Mhz,SPI2最高为18Mhz。 SPI的四种模式 CPOL CPHA,数据帧8~16位,LSB,MSB 全双工,双向单线,单线 物理层 接口标准…...

【Pytorch】Tensor的分块、变形、排序、极值与in-place操作
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 这是目录Tensor的分块Tensor的变形Tensor的排序Tensor的极值Tensor的in-place操作Tensor是PyTorch中用于存储和处理多维数据的基本数据结构,它类似于NumPy中的ndarray&…...

数组栈的实现
个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【数据结构初阶(C实现)】 目录所有接口函数栈的初始化在栈顶放数据释放数据删除数据取栈顶的数据判断栈取区是否为…...

*p++,*(p++),*++p,(*p)++区别?
*p++:等同于:*p; p += 1; 解析:由于和++的运算优先级一样,且是右>结合。故p++相当于*(p++),p先与++结合,>然后p++整体再与结合。前面陈述是一种最 常见的错误,很多初学者也是这么理解的。 但是,因为++后置的时候,本身含义就是先 运算后增加1(运算指的是p++作为…...

又一个线上偶发问题-系统短暂无法获取到Redis连接
概述 最近不知道咋回事,老是在线上遇到偶发的故障,它突然出现,又很快消失了。 在2023年3月11下午差不多六点左右,我正在工位上喝着香味扑鼻的金骏眉红茶,突然接到了一个电话,拿起手机一看,是阿里…...

[ 系统安全篇 ] 拉黑IP - 火绒安全软件设置IP黑名单 windows使用系统防火墙功能设置IP黑名单
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

MongoDB【部署 01】mongodb最新版本6.0.5安装部署配置使用及mongodb-shell1.8.0安装使用(云盘分享安装文件)
云盘分享文件: 链接:https://pan.baidu.com/s/11sbj1QgogYHPM4udwoB1rA 提取码:l2wz 1.mongodb简单介绍 MongoDB的 官网 内容还是挺丰富的。 是由 C语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下&…...

算法竞赛必考算法——动态规划(01背包和完全背包)
动态规划(一) 目录动态规划(一)1.01背包问题1.1题目介绍1.2思路一介绍(二维数组)1.3思路二介绍(一维数组) 空间优化1.4思路三介绍(输入数据优化)2.完全背包问题2.1题目描述:2.2思路一(朴素算法)2.3思路二(将k优化处理掉)2.4思路三(优化j的初始条件)总结1.01背包问题…...

基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
摘要:农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注、记录和保存病害位置和类型,辅助作物病害防治以增加产值。本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统,在介绍算法原理的同时&#…...

QT入门Item Views之QListView
目录 一、QListView界面相关 1、布局介绍 二、代码展示 1、创建模型,导入模型 2、 设置隔行背景色 3、删除选中行 三、源码下载 此文为作者原创,创作不易,转载请标明出处! 一、QListView界面相关 1、布局介绍 先看下界面…...

GEE:计算1990-2021年的指数最大值和最小值,并根据最大最小值对每一副影像归一化
本文记录了在GEE平台上计算影像集合中所有像素的最大值和最小值。并且根据该最大最小值对所有影像进行最大最小值归一化。以SAVI为例,记录了主要函数的使用方法和代码。 结果如图所示, 文章目录 一、计算每一副影像的最大值或者最小值,并将最值保存在 List 中二、计算 Lis…...

LeetCode KMP 算法
可以参考https://www.bilibili.com/video/BV1AY4y157yL/kmp 主要做的就是子串匹配,类似C程序的 strstr() 函数记录一下,也防止我自己忘记传统暴力求解算法是源串 ssssssssa 子串 sssa(下面暴力求解) 先 (子串从 0 位置匹配&#x…...

全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里
最强的文本生成模型GPT-4一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展四、与之前 GPT 系列模型比较五、…...

leetcode——26. 删除有序数组中的重复项
文章目录🐨1. 题目🏹2. 思路🪃3. 代码实现🐨1. 题目 给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。 由…...

基于springboot垃圾分类网站设计实现【毕业论文、源码】
摘要本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述垃圾分类网站的当前背景以及系统开发的目的&#x…...

计算机组成原理实验一(完整)
在VC中使用调试功能将下列语句运行的内存存放结果截图,每运行一句需截图一次。 #include<stdio.h> int main() {int a 你的学号末两位-100; //0x????????&#x…...