文章目录

  • [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

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。




解析:

使用双指针,开始时,判断最左边的值 与 最右边的值 哪个小,取小的来计算容量,因为“水往低处流”;容量 = 较小值 *(右下标-左下标);然后再移动指针,哪个指针指向的值小 就移动哪个指针。

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;}
}


时间复杂度:O(n),双指针总计最多遍历整个数组一次。

空间复杂度:O(1),只需要额外的常数级别的空间

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 不对应任何字母。


解析:

回溯算法

对于打印"2345"这样的字符串:
第一次递归就是上图中最下面的方格,然后处理完第一个字符2之后,将输入的字符改变成"345"并调用第二个递归函数
第二次递归处理3,将字符串改变成"45"后再次递归
第三次递归处理4,将字符串改变成"5"后继续递归
第四次递归处理5,将字符串改变成""后继续递归
最后发现字符串为空了,将结果放到列表中并返回
上面是从函数调用的角度去看的,而每次调用下一层递归时,都需要将本层的一些处理结果放到一个临时变量中,再传递给下一层,从这个变量层层传递的变化看,就像一棵树一样,这个算法的时间复杂度很高,是O(3^n)这个级别的,空间复杂度是O(n)


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 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?



解法一:

删除一个结点,无非是遍历链表找到那个结点前边的结点,然后改变下指向就好了。但由于它是链表,它的长度我们并不知道,我们得先遍历一遍得到它的长度,之后用长度减去 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)。

空间复杂度:O(1)。


解法二:

想象一下,两个人进行 100m 赛跑,假设他们的速度相同。开始的时候,第一个人就在第二个人前边 10m ,这样当第一个人跑到终点的时候,第二个人相距第一个人依旧是 10m ,也就是离终点 10m。

对比于链表,我们设定两个指针,先让第一个指针遍历 n 步,然后再让它俩同时开始遍历,这样的话,当第一个指针到头的时候,第二个指针就离第一个指针有 n 的距离,所以第二个指针的位置就刚好是倒数第 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) {//加一个空的结点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();}
}


时间复杂度:O(n)。

空间复杂度:O(n)。

算法题解(Leetcode 11、15、17、19、20:盛最多水的容器、三数之和、电话号码的字母组合、删除链表的倒数第 N 个结点、有效的括号)相关推荐

  1. 算法leetcode|11. 盛最多水的容器(rust重拳出击)

    文章目录 11. 盛最多水的容器: 样例 1: 样例 2: 提示: 原题传送门: 分析 题解 rust go c++ java typescript python 11. 盛最多水的容器: 给定一个长 ...

  2. 【力扣(LeetCode)】【C/C++】【19.删除链表的倒数第 N 个结点】

    学习时间: 2023年1月30日 题目描述: 题解分享: // 作 者 : 繁 华 倾 夏 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h&g ...

  3. 《LeetCode力扣练习》第19题 删除链表的倒数第 N 个结点 Java

    <LeetCode力扣练习>第19题 删除链表的倒数第 N 个结点 Java 一.资源 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例 1: 输入:hea ...

  4. LeetCode Algorithm 19. 删除链表的倒数第 N 个结点

    19. 删除链表的倒数第 N 个结点 Ideas 链表经典题目,还是09年考研408数据结构最后一道大题,在LeetCode上只能算中等难度的题目. 说回题目其实不难,之前跟着左神练了很多双指针的题目 ...

  5. 【LeetCode】【HOT】19. 删除链表的倒数第 N 个结点(双指针)

    [LeetCode][HOT 100]19. 删除链表的倒数第 N 个结点 文章目录 [LeetCode][HOT 100]19. 删除链表的倒数第 N 个结点 package hot;import ...

  6. [贪心|双指针] leetcode 11 盛最多水的容器

    [贪心|双指针] leetcode 11 盛最多水的容器 1.题目 题目链接 给你 n 个非负整数 a1,a2,-,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 ...

  7. leetcode系列-11.盛最多水的容器

    leetcode系列–第11题.盛最多水的容器 给定一个长度为 n 的整数数组 height .有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) .找出其中的两 ...

  8. LeetCode 11. 盛最多水的容器

    11. 盛最多水的容器 思路:双指针,放弃低的那边 class Solution { public:int maxArea(vector<int>& height) {int n= ...

  9. leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

最新文章

  1. matlab神经网络工具箱函数汇总
  2. C语言中函数的参数列表为空和void的区别
  3. Linux下 SpringBoot jar项目后台运行、查看、停用
  4. OpenCV—基本矩阵操作与示例
  5. ES 在数据量很大的情况下如何提高查询效率
  6. python去掉人像白边_python 使用plt画图,去除图片四周的白边方法
  7. oracle 全文检索技术
  8. 单多晶技术拉锯战升级
  9. 优质书籍资源仓库推荐【欢迎推送书籍】
  10. 向日葵和teamviewer免费版的替代品RD远控。
  11. ireader_使用iReader在Chrome和Firefox上获取Safari Reader
  12. 大数据日志分析Hadoop项目实战
  13. 排序算法中的LowB三人组
  14. python打包android的app,出现 Could not load the Qt platform plugin “xcb“的解决方法
  15. cos41度用计算机怎么算,用电监察计算(精品)
  16. 用于地址解析的协议是服务器,用于解析域名的协议是什么?
  17. 解决火狐,谷歌,ie兼容性问题
  18. 指令系统由计算机组成决定,《计算机组成原理》第5章指令系统.ppt
  19. DataBase_数据库的行式存储与列式存储
  20. TFLearn初探之Activation与Dropout

热门文章

  1. 如何将分表汇总到总表_Excel如何实现将动态的分表数据汇总到总表
  2. s905中文版linux,S905/S905M安装LAKKA教程
  3. android 微信分享出去的图片不显示或显示成应用图标
  4. ipad分屏功能_ipad OS更新,全新升级7大功能
  5. POJ 2942 Knights of the Round Table 【点双联通 + 二分图染色法判奇环】
  6. C语言实现两个整数相加
  7. 集360搜狗神马搜索引擎SEO批量查询工具包
  8. 电脑睡眠、休眠后,电脑卡顿,CPU主频变得很低的解决方法
  9. web和微信小程序input输入时禁止输入中文方法
  10. 从 Java sleep 来看 arm64 Linux 内核都干了些什么?