剑指offer+leetcode
WTHunt
厚积薄发
展开
-
翻转字符串里的单词—leetcode151
给定一个字符串,逐个翻转字符串中的每个单词。说明:无空格字符构成一个 单词 。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。示例 1:输入:"the sky is blue"输出:"blue is sky the"示例 2:输入:" hello world! "输出:"world! hello"解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:...原创 2021-01-09 12:43:33 · 204 阅读 · 0 评论 -
路径总和 II—leetcode113
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明:叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,11,2], ..原创 2020-12-27 22:33:11 · 83 阅读 · 0 评论 -
二叉树的后序遍历—leetcode145
给定一个二叉树,返回它的后序遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]进阶:递归算法很简单,你可以通过迭代算法完成吗?方法一:递归法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;...原创 2020-12-19 01:02:11 · 134 阅读 · 1 评论 -
字符串相加—leetcode415
给定两个字符串形式的非负整数num1和num2,计算它们的和。提示:num1和num2的长度都小于 5100 num1和num2都只包含数字0-9 num1和num2都不包含任何前导零 你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式class Solution {public: string addStrings(string num1, string num2) { int N1 = num1.l...原创 2020-12-14 18:28:04 · 126 阅读 · 0 评论 -
二叉树的右视图—leetcode199
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入:[1,2,3,null,5,null,4]输出:[1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---/** * Definition for a binary tree node. * struct TreeNode { ...原创 2020-12-14 16:13:10 · 210 阅读 · 0 评论 -
二叉树的锯齿形层次遍历—leetcode103
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层次遍历如下:[ [3], [20,9], [15,7]]class Solution {public: vector<vector<int>> zig..原创 2020-12-14 14:45:47 · 225 阅读 · 0 评论 -
无重复字符的最长子串—leetcode3
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度...原创 2020-12-13 10:18:20 · 261 阅读 · 0 评论 -
旋转数组—leetcode189
给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例2:输入: [-1,-100,3,99] 和 k = 2输出: [3,99,-1,-100]解释: 向右旋转 1 步: [99,-1,-100...原创 2020-11-24 19:09:25 · 141 阅读 · 0 评论 -
加一—leetcode66
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。示例2:输入:digits = [4,3,2,1]输出:[4,3,2,2]解释:输入数组表示数字 4321。示例 3:输入:digits = [0]输出:[1]提示:...原创 2020-11-24 09:44:04 · 75 阅读 · 0 评论 -
搜索插入位置—leetcode35
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0思路:排除一定不可能的范围,保留[mid,end],然后再加上特殊情况处理cla...原创 2020-11-22 22:58:36 · 116 阅读 · 0 评论 -
矩阵置零—leetcode73
给定一个mxn的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。示例1:输入: [ [1,1,1], [1,0,1], [1,1,1]]输出: [ [1,0,1], [0,0,0], [1,0,1]]示例2:输入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5]]输出: [ [0,0,0,0], [0,4,5,0], [0,3,1,0]]进阶:一个...原创 2020-11-22 21:59:26 · 909 阅读 · 0 评论 -
合并两个有序数组—leetcode88
给你两个有序整数数组nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。 你可以假设nums1有足够的空间(空间大小大于或等于m + n)来保存nums2中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]提示:-10^9...原创 2020-11-20 01:10:24 · 107 阅读 · 0 评论 -
缺失的第一个正数—leetcode41
给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。示例1:输入: [1,2,0]输出: 3示例2:输入: [3,4,-1,1]输出: 2示例3:输入: [7,8,9,11,12]输出: 1提示:你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。思路:将数值与下标产生联系,将nums[i]放到索引为nums[i]-1的位置,需要注意超出数组len的值与非正数不做处理直接跳过,最后遍历判断数值是否在正确的位置即可...原创 2020-11-20 00:38:45 · 180 阅读 · 0 评论 -
最长公共前缀—leetcode14
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入: ["flower","flow","flight"]输出: "fl"示例2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母a-z。思路:遍历暴力解法,不满足条件提前返回就好class Solution {public: string longestCommo...原创 2020-11-19 23:52:24 · 138 阅读 · 0 评论 -
整数反转—leetcode7
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。思路:常规方法,简单题!class Solution {public: int reve...原创 2020-11-17 23:07:13 · 95 阅读 · 0 评论 -
搜索二维矩阵 II—leetcode240
编写一个高效的算法来搜索mxn矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。 每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target=5,返回true...原创 2020-11-12 18:41:40 · 89 阅读 · 0 评论 -
分割等和子集—leetcode416
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100 数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.思路:01背包问题求解1.引用:经典动态规划:0-1背包问题的变体那么..原创 2020-11-12 02:08:47 · 415 阅读 · 0 评论 -
找到字符串中所有字母异位词—leetcode438
给定一个字符串s和一个非空字符串p,找到s中所有是p的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串s和p的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。 不考虑答案输出的顺序。示例1:输入:s: "cbaebabacd" p: "abc"输出:[0, 6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。起始索引等于 6 的子串是 "bac", 它是 "a...原创 2020-10-14 08:14:56 · 192 阅读 · 1 评论 -
零钱兑换—leetcode322
给定不同面额的硬币coins和一个总金额amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。示例1:输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount = 0输出:0示例...原创 2020-10-13 23:29:34 · 217 阅读 · 0 评论 -
最大正方形—leetcode221
参考链接:https://zhuanlan.zhihu.com/p/92355321在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。示例:输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4思路: 动态规划递推方程式:dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1class Solution {publ.原创 2020-10-13 00:28:17 · 139 阅读 · 0 评论 -
除自身以外数组的乘积—leetcode238
给你一个长度为n的整数数组nums,其中n> 1,返回输出数组output,其中output[i]等于nums中除nums[i]之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明:请不要使用除法,且在O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的...原创 2020-10-11 21:52:12 · 144 阅读 · 0 评论 -
根据身高重建队列—leetcode406
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]思路:将整数对 (h, k) 按照 h 降序排序,如果 h 相同,则按照 k 升序排序。排序完.原创 2020-10-10 08:33:02 · 94 阅读 · 0 评论 -
每日温度—leetcode739
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0 来代替。例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是[1, 30000]。每个气温的值的均为华氏度,都是在[30, 100]范围内的整数。思路1:简单直观方法,暴力搜索,可惜...原创 2020-10-09 08:05:10 · 217 阅读 · 0 评论 -
回文子串—leetcode647
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:"abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:"aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"提示:输入的字符串长度不会超过 1000 。思路:中心点思想,一个+两个为中心点的情况一共由len+len-1种,这两种情况可以原创 2020-10-08 21:22:13 · 107 阅读 · 0 评论 -
完全平方数—leetcode279
给定正整数n,找到若干个完全平方数(比如1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.思路:动态规划使用dp的重点在于递推式:f(i)=1+min{f(i-1*1),f(i-2*2),...,f(i-k*k)}k为小于i的最大完全平方数凑成数值i的最少平方数的个数...原创 2020-10-08 11:30:01 · 121 阅读 · 0 评论 -
x的平方根—leetcode69
实现int sqrt(int x)函数。计算并返回x的平方根,其中x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。方法:二分法,要注意的就是开根号要取小,实现的时候记录以下mid*mid<x时候的mid值就可以解决class Solution {public: ...原创 2020-09-23 22:28:18 · 124 阅读 · 0 评论 -
三角形最小路径和—leetcode120
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为11(即,2+3+5+1= 11)。https://blog.csdn.net/wodemaoheise/article/details/107350930...原创 2020-09-03 23:28:24 · 144 阅读 · 0 评论 -
K个一组翻转链表—leetcode25
给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当k= 2 时,应当返回:2->1->4->3->5当k= 3 时,应当返回:3->2->1->4->5说明:你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内...原创 2020-09-03 22:47:27 · 147 阅读 · 0 评论 -
分割数组的最大值—leetcode410
给定一个非负整数数组和一个整数m,你需要将这个数组分成m个非空的连续子数组。设计一个算法使得这m个子数组各自和的最大值最小。注意:数组长度n满足以下条件:1 ≤n≤ 1000 1 ≤m≤ min(50,n)示例:输入:nums = [7,2,5,10,8]m = 2输出:18解释:一共有四种方法将nums分割为2个子数组。其中最好的方式是将其分为[7,2,5] 和 [10,8],因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。...原创 2020-09-01 11:44:22 · 334 阅读 · 0 评论 -
可被三整除的最大和—leetcode1262
给你一个整数数组nums,请你找出并返回能被三整除的元素最大和。示例 1:输入:nums = [3,6,5,1,8]输出:18解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。示例 2:输入:nums = [4]输出:0解释:4 不能被 3 整除,所以无法选出数字,返回 0。示例 3:输入:nums = [1,2,3,4,4]输出:12解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。..原创 2020-08-31 22:24:19 · 2253 阅读 · 2 评论 -
剑指offer--整数中1出现的次数
一个更好的办法是利用数学公式直接计算出最终的结果,该方法是依次求出数字 X 在个位、十位、百位等等出现的次数,再相加得到最终结果。博客地址从 1 至 10,在它们的个位数中,任意的 X 都出现了 1 次。 从 1 至 100,在它们的十位数中,任意的 X 都出现了 10 次。 从 1 至 1000,在它们的千位数中,任意的 X 都出现了 100 次。依此类推,从 1 至 10^i,在它们的左数第二位(右数第 i 位)中,任意的 X 都出现了 10^(i−1) 次。接下来以 n=259...原创 2020-08-27 00:33:31 · 182 阅读 · 0 评论 -
剑指offer--不用加减乘除做加法
思路: 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。 同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。 第二步:计算进位值,得到1010,相当于各位做与操作得到1...原创 2020-08-26 22:48:24 · 150 阅读 · 0 评论 -
目标和—leetcode494
给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号+和-。对于数组中的任意一个整数,你都可以从+或-中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例:输入:nums: [1, 1, 1, 1, 1], S: 3输出:5解释:-1+1+1+1+1 = 3+1-1+1+1+1 = 3+1+1-1+1+1 = 3+1+1+1-1+1 = 3+1+1+1+1-1 = 3一共有5种方法让最终目...原创 2020-08-23 23:21:50 · 130 阅读 · 0 评论 -
前 K 个高频元素—leetcode347
给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(nlogn) ,n是数组的大小。 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 你可以按任意顺序返...原创 2020-07-30 10:54:45 · 184 阅读 · 1 评论 -
和为K的子数组—leetcode560
给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] ,且整数k的范围是[-1e7, 1e7]。方法一: 暴力索引class Solution {public: int subarraySum(vector...原创 2020-07-24 20:13:04 · 234 阅读 · 0 评论 -
滑动窗口最大值—leetcode239
难度困难462给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- ...原创 2020-07-24 15:00:11 · 292 阅读 · 0 评论 -
比特位计数—leetcode338
给定一个非负整数num。对于0 ≤ i ≤ num 范围中的每个数字i,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例2:输入: 5输出: [0,1,1,2,1,2]进阶:给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的__buil...原创 2020-07-16 17:48:07 · 142 阅读 · 0 评论 -
寻找重复数—leetcode287
给定一个包含n + 1 个整数的数组nums,其数字都在 1 到 n之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次。思路:二分查找,如果小于等于mid值的cou...原创 2020-07-15 19:47:45 · 146 阅读 · 0 评论 -
最长上升子序列—leetcode300
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为O(n2) 。进阶: 你能将算法的时间复杂度降低到O(n log n) 吗?解法一:动态规划,看一下应该就能懂了class Solution {public: int leng...原创 2020-06-23 09:30:21 · 180 阅读 · 0 评论 -
数组中的第k个最大元素—leetcode215
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。解法一:冒泡排序,从后往前排,复杂度O(kn)class Solution {public: int findKthL...原创 2020-06-23 01:31:28 · 239 阅读 · 0 评论