leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、
- lee75 颜色分类 patition 三个指针
- lee76 最小覆盖字串 滑动窗口
- lee78 子集 无重复数字 回溯
- lee79 单词搜索 回溯
- lee84 柱状图中最大的矩形 单调栈
- lee85 最大矩形 (用84的方法,在矩阵中)
- lee95 二叉树中序遍历
- lee96 不同的二叉搜索树 总结规律 动态规划
- lee98 验证二叉搜索树
- lee101 对称二叉树
lee75 颜色分类
同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
public void sortColors(int[] nums) {int len = nums.length;if (len < 2) {return;}// all in [0, zero] = 0// all in (zero, i) = 1// all in (two, len - 1] = 2// 为了保证初始化的时候 [0, zero] 为空,设置 zero = -1,// 所以下面遍历到 0 的时候,先加,再交换int zero = -1;// 为了保证初始化的时候 (two, len - 1] 为空,设置 two = len - 1// 所以下面遍历到 2 的时候,先交换,再减int two = len - 1;int i = 0;// 当 i == two 的时候,还有一个元素还没有看,// 因此,循环可以继续的条件是 i <= twowhile (i <= two) {if (nums[i] == 0) {zero++;swap(nums, i, zero);i++;} else if (nums[i] == 1) {i++;} else {swap(nums, i, two);two--;}}
}private void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;}
lee76 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
class Solution {public String minWindow(String s, String t) {HashMap<Character, Integer> need = new HashMap<>();HashMap<Character, Integer> window = new HashMap<>();// 存需要的字母,可能会有重复for (int i = 0; i < t.length(); i++) {char curChar = t.charAt(i);need.put(curChar, need.getOrDefault(curChar, 0) + 1);}int left = 0, right = 0;int valid = 0;int start = 0, minLen = Integer.MAX_VALUE;while (right < s.length()) {char c = s.charAt(right);right++;if (need.containsKey(c)) {window.put(c, window.getOrDefault(c, 0) + 1);if ((int)window.get(c) ==(int) need.get(c)) {// 强转valid++;}}// 判断左侧窗口while (valid == need.size()) {if (right - left < minLen) {start = left;minLen = right - left;}char d = s.charAt(left);left++;if (need.containsKey(d)) {if ((int)window.get(d) ==(int) need.get(d)) {// 强转valid--;}window.put(d, window.get(d) - 1);}}}return minLen == Integer.MAX_VALUE ? "" : s.substring(start, start + minLen);}
}
lee78 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
solution1 回溯
class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<>();backtrack(0, nums, res, new ArrayList<Integer>());return res;}private void backtrack(int i, int[] nums, List<List<Integer>> res, ArrayList<Integer> tmp) {res.add(new ArrayList<>(tmp));for (int j = i; j < nums.length; j++) {tmp.add(nums[j]);backtrack(j + 1, nums, res, tmp);tmp.remove(tmp.size() - 1);}}
}
solution2 迭代
class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<>();res.add(new ArrayList<>());for (int i = 0; i < nums.length; i++) {int all = res.size();for (int j = 0; j < all; j++) {List<Integer> tmp = new ArrayList<>(res.get(j));tmp.add(nums[i]);res.add(tmp);}}return res;}
}
类lee90 子集2
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> res=new ArrayList<>();if(nums==null || nums.length==0 ) return res;Arrays.sort(nums);helper(nums, res, new ArrayList<>(), 0);return res;}private void helper(int[] nums, List<List<Integer>> res, List<Integer> list,int start){res.add(new ArrayList<>(list));for(int i=start;i<nums.length;i++){if(i>start && nums[i] ==nums[i-1]) continue;list.add(nums[i]);helper(nums, res, list, i+1);list.remove(list.size()-1);}}
}
lee79 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
class Solution {public boolean exist(char[][] board, String word) {char[] s=word.toCharArray();int[][] flag=new int[board.length][board[0].length];for(int i=0;i<board.length;i++){for(int j=0;j<board[0].length;j++){if(board[i][j]==s[0]){if( existHelper(board, 0, s, i, j, flag ) ){//必须有个判断,因为不止搜到的第一个为开头遍历return true;}}}}return false;}public boolean existHelper(char[][] board, int index,char[] s ,int startx, int starty, int[][] flag){if(index==s.length) return true;if( startx<0|| startx>=board.length || starty<0 || starty>=board[0].length || flag[startx][starty]==1 ||board[startx][starty]!= s[index]){return false;}flag[startx][starty]=1;if( existHelper(board,index+1,s, startx+1,starty,flag)||existHelper(board,index+1,s, startx,starty+1,flag)||existHelper(board,index+1,s, startx-1,starty,flag)||existHelper(board,index+1,s, startx,starty-1,flag)){return true;}flag[startx][starty]=0;return false;}
}
lee84 柱状图中的最大矩形 单调栈
class Solution {public int largestRectangleArea(int[] heights) {// 这里为了代码简便,在柱体数组的头和尾加了两个高度为 0 的柱体。int[] tmp = new int[heights.length + 2];System.arraycopy(heights, 0, tmp, 1, heights.length); Deque<Integer> stack = new ArrayDeque<>();int area = 0;for (int i = 0; i < tmp.length; i++) {// 对栈中柱体来说,栈中的下一个柱体就是其「左边第一个小于自身的柱体」;// 若当前柱体 i 的高度小于栈顶柱体的高度,说明 i 是栈顶柱体的「右边第一个小于栈顶柱体的柱体」。// 因此以栈顶柱体为高的矩形的左右宽度边界就确定了,可以计算面积
leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、相关推荐
- 【进大厂的leetcode必刷题】之目录汇总
只要看下面几个面试概率大的leetcode题目即可,二刷.三刷.四刷都行.不求题海战术,只要掌握几个经典的类型就能应付大部分面试公司. 题目实时更新中 二叉树 1.leetcode108.将有序数组转 ...
- 数据结构与算法--力扣108题将有序数组转换为二叉搜索树
力扣108提将有序数组转换为二叉搜索树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫, ...
- 刻意练习:LeetCode实战 -- 不同的二叉搜索树
背景 今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是"不同的二叉搜索树 II",而LeetCode也有"不同的二叉搜索树"题目,故一起写了 ...
- 计算机基础知识必刷,《2019年江苏专转本考试-计算机基础必刷题题库(第四章)》...
<2019年江苏专转本考试-计算机基础必刷题题库(第四章)> 一.判断 共3题 (共计3分) 第1题: 计算机信息系统的特征之一是处理的数据量大,因此必须在内存中设置缓冲区,用以长期保 ...
- 四 . LeetCode标签刷题——树/二叉树(一) 算法部分
各种二叉树的介绍汇总: 二叉树:最多有两棵子树的树被称为二叉树 满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上 完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二 ...
- LeetCode算法刷题目录 (Java)
目录 1.数学基础 1.1.位运算 1.2.其它 2.数据结构 2.1.线性表 2.1.1.数组(双指针) 2.1.2.链表(双指针) 2.1.3.栈 2.1.4.队列 2.1.5.字符串 2.1.6 ...
- 【Leetcode】 刷题之路1(python)
leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...
- 3维两点间的距离 js_高考必刷题4:球面上任意两点间距离的计算
678地理工作室,每天,6:13 678地理工作室诚邀一起合作的小伙伴 文章首发于微信公众号"老丁侃地理",欢迎关注 本文为老丁原创,引用请注明来源 第一部分:经纬网部分,考纲和知 ...
- LeetCode代码刷题(17~24)
目录 17. 电话号码的字母组合 18. 四数之和 19. 删除链表的倒数第 N 个结点 20. 有效的括号 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表 ...
最新文章
- javascript 忍者秘籍读书笔记
- CodeForces - 1437G Death DBMS(AC自动机fail树上树链剖分建线段树/暴跳fail)
- Java程序创建Kafka Topic,以及数据生产消费,常用的命令
- python中的引用怎么理解_python 引用和对象理解
- 流浪不是我的初衷 ... ...
- flask 中文编码解码
- Charm Bracelet(POJ-3624)
- mysql查询id为5的数据类型_MySql学习05---数据类型
- mixins,generics(ApiView)
- 单个用户OWA登陆失败,提示用户名和密码错误
- EXCEL 宏 拆分数据表 VBA 视频教程下载
- android RN开发环境搭建
- STM32 FreeRTOS系列教程(一)FreeRTOS简介
- 找到自己的优势,才能干活不累,事半功倍!
- OOP(面向对象)总结(有这一篇足矣)
- 003-Xshell和Xftp连接CentOS
- 【洛谷】P1567 统计天数
- 主板aspm关闭_bios关闭acpi的方法步骤图文详解
- ASP.NET WEBAPI 跨域请求 405错误
- 脾胃虚弱用什么中成药比较好?
热门文章
- Android 之UI自适应解决方案
- Androidstudio 最权威使用技巧, 持续更新
- 如何才能做好一个软件系统?
- 微信小程序_图片连拍_闪光灯_手电筒_录制
- 计算机毕业设计Java悦途旅游网(系统+程序+mysql数据库+Lw文档)
- Effective C++读书摘要--Accustoming Youself to C++
- 2021年全球灌装设备收入大约1194.6百万美元,预计2028年达到1604.7百万美元
- 重新开始:第一篇,创建GitHub 仓库,搭建项目基础
- UI设计是青春饭?今天告诉你真相!
- 绘制STM32最小系统电路原理图、STM32F103读取SD卡的数据