算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)
文章目录
- [11. 盛最多水的容器 - 中等 - 9/7](https://leetcode-cn.com/problems/container-with-most-water/)
- [15. 三数之和 - 中等 - 9/8](https://leetcode-cn.com/problems/3sum/)
- [17. 电话号码的字母组合 - 中等 - 9/9](https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/)
- [19. 删除链表的倒数第 N 个结点 - 中等 - 9/10](https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/)
- [20. 有效的括号 - 简单 - 9/11](https://leetcode-cn.com/problems/valid-parentheses/)
11. 盛最多水的容器 - 中等 - 9/7
使用双指针,开始时,判断最左边的值 与 最右边的值 哪个小,取小的来计算容量,因为“水往低处流”;容量 = 较小值 *(右下标-左下标);然后再移动指针,哪个指针指向的值小 就移动哪个指针。
class Solution {public int maxArea(int[] height) {int min = 0; //存放最小值int sum = 0; //计算结果int left = 0; //左指针int right = height.length - 1; //右指针while (left < right){//当左边的值 小于等于 右边的值时,取两者较小的值,计算容量。容量 = 较小值 *(右下标-左下标)。然后移动左指针if (height[left] <= height[right]){min = height[left];sum = Math.max(sum,min * (right-left));left++;}else { //左边的值 大于 右边的值min = height[right];sum = Math.max(sum,min * (right-left));right--;}}//返回结果return sum;}
}
15. 三数之和 - 中等 - 9/8
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
class Solution {public List<List<Integer>> threeSum(int[] nums) {int len = nums.length;//待返回的数组List<List<Integer>> ans = new ArrayList<>();//如果数组为空 或者 数组的长度小于3if (nums == null || len < 3) return ans;//排序Arrays.sort(nums);//遍历for (int i = 0; i < len; i++) {//如果当前 排序后的数大于0,则三数之和一定不为0if (nums[i] > 0) break;//去重if (i > 0 && nums[i] == nums[i - 1]) continue;//当前数后面的左指针int left = i + 1;//当前数后面的右指针int right = len - 1;//循环while (left < right) {//计算和int sum = nums[i] + nums[left] + nums[right];//如果结果为0if (sum == 0) {//添加到集合ans.add(Arrays.asList(nums[i], nums[left], nums[right]));//去重while (left < right && nums[left] == nums[left + 1]) left++;while (left < right && nums[right] == nums[right - 1]) right--;left++;right--;}//如果sum<0,说明负数大了,应将左指针向右移动一位else if (sum < 0) left++;else if (sum > 0) right--;}}return ans;}
}
17. 电话号码的字母组合 - 中等 - 9/9
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
class Solution {//数字到字符串的映射String[] str = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//结果集List<String> res = new ArrayList<>();//路径 操作字符 StringBuilder sb = new StringBuilder();public List<String> letterCombinations(String digits) {//特殊处理if(digits == null || digits.length() == 0) return res;//调用回溯函数 backtrack(digits,0);return res;}//回溯函数void backtrack(String digits,int index){//退出条件 如果 输入字符的长度 等于 操作字符的长度 就把操作字符添加进去,然后返回if(digits.length() == sb.length()){res.add(sb.toString());return;}//获取当前数字对应的字符串String val = str[digits.charAt(index) - '2'];//遍历for(char v: val.toCharArray()){sb.append(v); //拼接字符backtrack(digits,index+1); //递归调用,index+1是 使用下一个数字对应的字符串 //操作完成后删除刚才用过的字母sb.deleteCharAt(sb.length()-1);}}
}
19. 删除链表的倒数第 N 个结点 - 中等 - 9/10
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//记录长度int len = 0;//复制一个头指针ListNode h = head;//计算长度while(h != null){h = h.next;len++;}//长度等于 1 ,再删除一个结点就为 null 了if(len == 1){return null;}//计算待删除节点的位置int rm_node_index = len - n;//如果删除的是头结点,返回后面的。if(rm_node_index == 0){return head.next;}//重新赋值h = head;//找到删除结点的前一个结点位置for(int i=0; i < rm_node_index-1; i++){h = h.next;}//改变指向,就是删除h.next = h.next.next;return head;}
}
时间复杂度:假设链表长度是 L ,那么就第一个循环是 L 次,第二个循环是 L - n 次,总共 2L - n 次,所以时间复杂度就是 O(L)。
想象一下,两个人进行 100m 赛跑,假设他们的速度相同。开始的时候,第一个人就在第二个人前边 10m ,这样当第一个人跑到终点的时候,第二个人相距第一个人依旧是 10m ,也就是离终点 10m。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//加一个空的结点ListNode dummy = new ListNode(0);//让它指向头指针dummy.next = head;ListNode first = dummy;ListNode second = dummy;//第一个指针先移动 n 步for (int i = 1; i <= n + 1; i++) {first = first.next;} //第一个指针到达终点停止遍历while (first != null) {first = first.next;second = second.next;}//改变指针方向,即为删除结点second.next = second.next.next;return dummy.next;}
}
20. 有效的括号 - 简单 - 9/11
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
暴力搜索这一组括号, 遇到左括号入栈,遇到右括号,那么我们拿这个右括号跟栈顶比较,如果能匹配,那么目前为止,这组括号有效,如果不能匹配,直接返回false。
class Solution {public boolean isValid(String s) {//创建一个栈Stack<Character> stack = new Stack();//遍历for(Character c : s.toCharArray()){if(c=='(' || c=='[' || c=='{'){stack.push(c); //入栈// 如果c是 )}] 并且栈不为空 则 判断栈顶是否为与之对应的左括号 是则出栈,不是则返回fasle}else if (c == ')' && !stack.empty() && stack.peek() == '('){stack.pop(); //出栈}else if (c == ']' && !stack.empty() && stack.peek() == '['){stack.pop(); //出栈}else if (c == '}' && !stack.empty() && stack.peek() == '{'){stack.pop(); //出栈}else{return false;}}return stack.empty();}
}
遍历整个字符串,遇到左括号就入栈,然后遇到和栈顶对应的右括号就出栈,遍历结束后,如果栈为空,就表示全部匹配。
class Solution {public boolean isValid(String s) {//创建栈Stack<Character> brackets = new Stack<Character>(); for(int i = 0;i < s.length();i++){char c = s.charAt(i);switch(c){case '(':case '[':case '{':brackets.push(c); //入栈break;case ')':if(!brackets.empty()){if(brackets.peek()== '('){ //取栈顶字符来比较brackets.pop(); //出栈}else{return false;}}else{return false;}break;case ']':if(!brackets.empty()){if(brackets.peek()=='['){brackets.pop();}else{return false;}}else{return false;}break;case '}':if(!brackets.empty()){if(brackets.peek()=='{'){brackets.pop();}else{return false;}}else{return false;}}}return brackets.empty();}
}
算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)相关推荐
- 算法leetcode|11. 盛最多水的容器(rust重拳出击)
文章目录 11. 盛最多水的容器: 样例 1: 样例 2: 提示: 原题传送门: 分析 题解 rust go c++ java typescript python 11. 盛最多水的容器: 给定一个长 ...
- 【力扣(LeetCode)】【C/C++】【19.删除链表的倒数第 N 个结点】
学习时间: 2023年1月30日 题目描述: 题解分享: // 作 者 : 繁 华 倾 夏 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h&g ...
- 《LeetCode力扣练习》第19题 删除链表的倒数第 N 个结点 Java
<LeetCode力扣练习>第19题 删除链表的倒数第 N 个结点 Java 一.资源 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例 1: 输入:hea ...
- LeetCode Algorithm 19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点 Ideas 链表经典题目,还是09年考研408数据结构最后一道大题,在LeetCode上只能算中等难度的题目. 说回题目其实不难,之前跟着左神练了很多双指针的题目 ...
- 【LeetCode】【HOT】19. 删除链表的倒数第 N 个结点(双指针)
[LeetCode][HOT 100]19. 删除链表的倒数第 N 个结点 文章目录 [LeetCode][HOT 100]19. 删除链表的倒数第 N 个结点 package hot;import ...
- [贪心|双指针] leetcode 11 盛最多水的容器
[贪心|双指针] leetcode 11 盛最多水的容器 1.题目 题目链接 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 ...
- leetcode系列-11.盛最多水的容器
leetcode系列–第11题.盛最多水的容器 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) .找出其中的两 ...
- LeetCode 11. 盛最多水的容器
11. 盛最多水的容器 思路:双指针,放弃低的那边 class Solution { public:int maxArea(vector<int>& height) {int n= ...
- leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器
❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...
最新文章
- matlab神经网络工具箱函数汇总
- C语言中函数的参数列表为空和void的区别
- Linux下 SpringBoot jar项目后台运行、查看、停用
- OpenCV—基本矩阵操作与示例
- ES 在数据量很大的情况下如何提高查询效率
- python去掉人像白边_python 使用plt画图,去除图片四周的白边方法
- oracle 全文检索技术
- 单多晶技术拉锯战升级
- 优质书籍资源仓库推荐【欢迎推送书籍】
- 向日葵和teamviewer免费版的替代品RD远控。
- ireader_使用iReader在Chrome和Firefox上获取Safari Reader
- 大数据日志分析Hadoop项目实战
- 排序算法中的LowB三人组
- python打包android的app,出现 Could not load the Qt platform plugin “xcb“的解决方法
- cos41度用计算机怎么算,用电监察计算(精品)
- 用于地址解析的协议是服务器,用于解析域名的协议是什么?
- 解决火狐,谷歌,ie兼容性问题
- 指令系统由计算机组成决定,《计算机组成原理》第5章指令系统.ppt
- DataBase_数据库的行式存储与列式存储
- TFLearn初探之Activation与Dropout
热门文章
- 如何将分表汇总到总表_Excel如何实现将动态的分表数据汇总到总表
- s905中文版linux,S905/S905M安装LAKKA教程
- android 微信分享出去的图片不显示或显示成应用图标
- ipad分屏功能_ipad OS更新,全新升级7大功能
- POJ 2942 Knights of the Round Table 【点双联通 + 二分图染色法判奇环】
- C语言实现两个整数相加
- 集360搜狗神马搜索引擎SEO批量查询工具包
- 电脑睡眠、休眠后,电脑卡顿,CPU主频变得很低的解决方法
- web和微信小程序input输入时禁止输入中文方法
- 从 Java sleep 来看 arm64 Linux 内核都干了些什么?