力扣刷题
文章平均质量分 68
从第一题开始,先刷个100题吧~
Coding&Sharing
itsbintnt@163.com
展开
-
力扣第三十三题-搜索旋转排序数组
前言力扣第三十三题 搜索旋转排序数组 如下所示:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k (0 <= k < nums.length) 上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0原创 2021-06-30 21:27:30 · 324 阅读 · 4 评论 -
力扣第三十二题-最长有效括号
前言力扣第三十二题 搜索旋转排序数组 如下所示:给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = “(()”输出:2解释:最长有效括号子串是 “()”示例 2:输入:s = “)()())”输出:4解释:最长有效括号子串是 “()()”示例 3:输入:s = “”输出:0一、思路这一题因为有这种一一对应的关系,所以第一眼看到就很自然的想到了使用 栈 来解决。要想知道最长的有效括号有两个关键点,如下所原创 2021-06-30 21:25:48 · 247 阅读 · 4 评论 -
力扣第三十一题-下一个排列
前言力扣第三十一题 下一个排列 如下所示:实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]示例 2:输入:nums = [3,2,1]输出:[1,2,3]示例 3:输入:nums = [1,1,5]输出:[1,5,1]示例 4:输入:nums = [原创 2021-06-28 23:12:52 · 154 阅读 · 2 评论 -
力扣第三十题-串联所有单词的子串
前言力扣第三十题 串联所有单词的子串 如下所示:.给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”, words = [“foo”,“bar”]输出:[0,9]解释:从索引 0 和 9 开始的子串分别是 “barfoo” 和 “fooba原创 2021-06-27 21:55:28 · 189 阅读 · 2 评论 -
力扣第二十九题-两数相除
前言力扣第二十九题 两数相除 如下所示:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3输出: 3解释: 10/3 = truncate(3原创 2021-06-26 21:26:24 · 294 阅读 · 2 评论 -
力扣第二十八题-实现 strStr()
前言力扣第二十八题 实现 strStr() 如下所示:实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相原创 2021-06-25 21:44:16 · 284 阅读 · 2 评论 -
力扣第二十七题-移除元素
前言力扣第二十七题 移除元素 如下所示:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2]解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出原创 2021-06-24 11:36:59 · 187 阅读 · 0 评论 -
力扣第二十六题-删除有序数组中的重复项
前言力扣第二十六题 删除有序数组中的重复项 如下所示:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:输入:n原创 2021-06-23 13:25:32 · 197 阅读 · 0 评论 -
力扣第二十五题-K 个一组翻转链表
前言力扣第二十五题 K 个一组翻转链表 如下所示:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]示例 2:输入:head = [原创 2021-06-22 22:24:09 · 671 阅读 · 4 评论 -
力扣第二十四题-两两交换链表中的节点
前言力扣第二十四题 两两交换链表中的节点 如下所示:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]一、思路既然要置换链表中的两两节点,很简单的思路就是从左至右遍历这个链表,只要碰到两个节点就交换。上面的这种遍历的形式,其实也可以通原创 2021-06-21 22:15:30 · 190 阅读 · 0 评论 -
力扣第二十三题-合并K个升序链表
前言力扣第二十三题 合并K个升序链表 如下所示:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组为:[1->4->5,1->3->4, 2->6],将它们合并到一个有序链表中得到:1->1->2->3->4->4->5->6示例 2:原创 2021-06-20 13:54:10 · 355 阅读 · 0 评论 -
力扣第二十二题-括号生成
前言力扣第二十二题 括号生成 如下所示:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]提示:1 <= n <= 8一、思路这题共有两种方式,暴力法和回溯穷举穷举法:列举所有的排列情况,然后排除非有效的括号以 n = 3 为例,总共有 2^2原创 2021-06-19 21:56:37 · 308 阅读 · 0 评论 -
力扣第二十一题-合并两个有序链表
前言力扣第二十一题 合并两个有序链表 如下所示:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]一、思路既然是合并两个升序链表,就可以很自然的想到使用迭代来进行合并了。大致的实现思路就是在遍历链表L1的过程原创 2021-06-18 21:22:48 · 304 阅读 · 2 评论 -
力扣第二十题-有效的括号
前言力扣第二十题 有效的括号 如下所示:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false一、思路看到这种一一对应匹配的问题,我第一反应就是想到用 栈 来实现。因为栈的数据结构是先进后出原创 2021-06-17 22:04:20 · 2445 阅读 · 4 评论 -
力扣第十九题-删除链表的倒数第 N 个结点
前言力扣第十九题 删除链表的倒数第 N 个结点 如下所示:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]一、思路这一题很直观的想法,先遍历一遍链表然后并记录下链表的总个数,然后再从头开始遍历,找到需要原创 2021-06-16 21:32:44 · 431 阅读 · 0 评论 -
力扣第十八题-四数之和
前言力扣第十八题 四数之和 如下所示:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]示例 2:输入:nums = [原创 2021-06-15 21:38:04 · 252 阅读 · 0 评论 -
力扣第十七题-电话号码的字母组合
前言力扣第十七题 电话号码的字母组合 如下所示:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1:输入:digits = “23”输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]示例 2:输入:digits = “”输出:[]示例 3:输入:digits = “2”输出:[“a”,“b”,“c”]原创 2021-06-14 23:34:46 · 666 阅读 · 2 评论 -
力扣第十六题-最接近的三数之和
前言力扣第十六题 最接近的三数之和 如下所示:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。一、思路这一题与前面的 第十五题-三数之和 思路上是一样的,还是采用 排序+双指针 来实现的。思路大原创 2021-06-13 17:00:10 · 180 阅读 · 0 评论 -
力扣第十五题-三数之和
前言力扣第十五题 三数之和 如下所示:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]一、思路要注意题目的结果时需要原创 2021-06-12 14:50:33 · 261 阅读 · 2 评论 -
力扣第十四题-最长公共前缀
前言力扣第十四题 最长公共前缀 如下所示:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例 1:输入:strs = [“flower”,“flow”,“flight”]输出:“fl”示例 2:输入:strs = [“dog”,“racecar”,“car”]输出:""解释:输入不存在公共前缀。一、思路这一题题目很短,也比较好理解。题目意思比较明确,也不需要简单的总结了。主要说一下实现的思路,主要分为以下几个步骤:从字符串数组中选原创 2021-06-11 23:13:48 · 355 阅读 · 0 评论 -
力扣第十三题-罗马数字转整数
前言力扣第十三题 罗马数字转整数 如下所示:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 I原创 2021-06-10 21:39:14 · 503 阅读 · 0 评论 -
力扣第十二题-整数转罗马数字
前言力扣第十二题 整数转罗马数字 如下所示:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 ~~~~~~~ 数值I$1V1 V1V~5X5 X5X~10L10 L10L50C50 C50C~100D100 D100D~500M500 M500M~~~~~~~~$1000例如, 罗马数字原创 2021-06-09 21:59:23 · 235 阅读 · 2 评论 -
力扣第十一题-盛最多水的容器
前言力扣第十一题 盛最多水的容器 如下所示:一、思路先理解一下题目的意思,就是求一个最大的面积。**严谨一点,用数学中的思想来表示一下: **假设数组为 a1,a2,...,an ,现有 ai、aj(i < j) 两个数,求 Min(ai, aj) * abs(i - j)Min(ai, aj) * (j - i) 中 j - i 表示容器底边长,Min(ai, aj) 表示容器的高这一题需要想明白一点,怎么样才能面积最大呢?其实很简单,两块板子相距越远,板子越高,得到的面积也就会越原创 2021-06-08 21:51:17 · 405 阅读 · 0 评论 -
力扣第十题-正则表达式匹配
前言力扣第十题 正则表达式匹配 如下所示:给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例 1:输入: s = “aa” p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入: s = “aa” p = “a*”输出: true解释: :因为 ‘*’ 代表可以原创 2021-05-28 21:31:09 · 817 阅读 · 0 评论 -
力扣第九题-回文数
前言力扣第九题 回文数 如下所示:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例 1:输入: x = 121输出: true示例 2:输入: x = -121输出: false解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: x = 10输出: false解释:从右原创 2021-05-27 22:05:55 · 650 阅读 · 0 评论 -
力扣第八题-字符串转换整数
前言力扣第七题 字符串转换整数 (atoi) 如下所示:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽原创 2021-05-26 22:59:39 · 473 阅读 · 1 评论 -
力扣第七题-整数反转
前言力扣第七题如下所示:一、思路二、实现三、总结原创 2021-05-25 21:05:02 · 255 阅读 · 0 评论 -
力扣第六题-Z字形变换
前言力扣第六题如下所示:一、思路理解一下题目的意思就是:将字符串以N的形式排列得到一个新的二维数组,再将二维数组输出为字符串例子如下所示:综上思路可以分为两个部分从左到右遍历字符串,并将当前的元素插入到对应的行列(如上图中的第5个元素应为第三行的第二列)遍历排列好的数组,输出结果即可二、实现代码实现变量说明:increase:是否增加index:第几行tips:在Java中可以使用StringBuilder提高性能 public String conv原创 2021-05-24 20:03:00 · 149 阅读 · 0 评论 -
力扣第五题-最长回文子串
前言力扣第五题如下所示:一、思路首先要知道什么是回文子串,定义如下:回文子串:正着念和反着念是一样的,例如abcdcba,正着念是abcdcba反着念也是abcdcba从题目可以得知以下两个信息:输入:字符串输出:最长回文子串目标:找到这个字符串的所有的回文子串,只保留最长即可。仔细看一下回文子串,你会发现回文子串左右添加同样的字符仍构成回文子串。例如:cdc左右都加上b为bcdcb仍是一个回文子串。假设字符串数组为str,i和j表示下标再将思路反过来,str[i]原创 2021-05-23 09:43:45 · 607 阅读 · 0 评论 -
力扣第四题-寻找两个正序数组的中位数
前言力扣第四题如下所示:一、思路这一题从题目可得知以下两个信息输入:两个数组(正序)输出:中位数那么最简单的思路就是将两个数组合并到一个数组,取中位数即可二、实现代码实现完整代码如下所示: /** * 归并 * 时间复杂度O(m+n) */ public double findMedianSortedArrays(int[] nums1, int[] nums2) { int[] arr = new int[num原创 2021-05-22 13:06:42 · 441 阅读 · 1 评论 -
力扣第三题-无重复的最长子串
前言力扣第三题如下所示:一、思路从左到右遍历字符串,并且判断当前的元素是否已经出现过。出现过:保存当前子串长度,继续向下没出现过:继续向下二、实现代码实现考虑到时间复杂度,可以使用滑动窗口来优化算法 public int lengthOfLongestSubstring(String s) { char[] chars = s.toCharArray(); int ret = 0; int left = 0;原创 2021-05-21 22:32:06 · 165 阅读 · 0 评论 -
力扣第二题-两数之和
前言力扣第二题如下图所示:一、思路在链表相加时,要考虑进位的情况比如:1->5->4->2->6 和 4->2->9相加时就会有进位的情况二、实现用carry表示进位实现代码如下所示:public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode root = new ListNode(0); ListNode cursor = root; int c原创 2021-05-20 22:02:03 · 173 阅读 · 0 评论 -
力扣第一题-两数之和
前言题目描述如下:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], targe原创 2021-05-20 20:53:12 · 292 阅读 · 0 评论 -
算法-动态规划学习(含经典例子分析)
文章目录前言一、动态规划是什么?二、经典例子爬楼梯问题三、总结前言在leetcode刷题的过程中,碰到了许多动态规划相关的题目,故系统性的学习了动态规划算法。此文章总结了学习过程中的一些思路,尽可能以例子的形式展现出来。如有错误之处,还望指正~一、动态规划是什么?动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。在我看来,动态规划主要分为两原创 2020-12-22 18:58:26 · 543 阅读 · 0 评论