
LeetCode高频算法面试题
面试过程中经常会考察leetcode算法题,这里以C++作为开发语言,记录面试过程中常考的高频算法题
JXH_123
这个作者很懒,什么都没留下…
展开
-
LeetCode C++32-买卖股票的最佳时机
要获取卖股票的最大利润,也就是需要在未来某一天高点卖出,过去的低点买入。所以,我们可以循环遍历数组,记录过去日子里面股价的最低值min_value,然后用当天的股价值value减去min_value,保存遍历过程中(value-min_value)最大值,即为利润最大值。解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。同时,你不能在买入前卖出股票。输入:prices = [7,6,4,3,1]输入:[7,1,5,3,6,4]原创 2023-06-11 23:53:51 · 451 阅读 · 0 评论 -
LeetCode C++31-交替打印FooBar
题目描述 leetcode原题链接:交替打印FooBar 两个不同的线程将会共用一个 FooBar实例:线程 A 将会调用foo()方法,而线程 B 将会调用bar()方法请设计修改程序,以确保 "foobar" 被输出 n 次。举例示例 1:输入:n = 1输出:"foobar"解释:这里有两个线程被异步启动。其中一个调用 foo() 方法, 另一个调用 bar() 方法,"foobar" 将被输出一次。示例 2:输入:n = ...原创 2022-03-02 00:02:02 · 657 阅读 · 0 评论 -
LeetCode C++30-字母异位词分组
题目描述 leetcode原题链接:字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。举例示例 1: 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","t...原创 2022-02-27 21:47:18 · 458 阅读 · 0 评论 -
LeetCode C++29-最大子数组和
题目描述 leetcode原题链接:最大子数组和 给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。举例示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6解释:连续子数组[4,-1,2,1] 的和最大,为6 。示例 2:输入:nums = [1] 输出:1示例 3:...原创 2022-02-27 20:35:24 · 411 阅读 · 0 评论 -
LeetCode C++28-子集
题目描述 leetcode题目链接:子集 给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。举例示例 1:输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0] 输出:[[],[0]]解题方法:回溯搜索。扫描每一个数字,每次可以选择...原创 2022-02-27 19:52:55 · 252 阅读 · 0 评论 -
LeetCode C++27-旋转图像
题目描述 题目链接:旋转图像 给定一个 n×n 的二维矩阵matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。举例示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]],输出:[[7,4,1],[8,5,2],[9,6,3]] 【注:图片来源:...原创 2022-02-27 14:52:33 · 182 阅读 · 0 评论 -
LeetCode C++26-Z字形变换
题目描述 leetcode原题链接:Z字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行Z 字形排列。比如输入字符串为 "PAYPALISHIRING"行数为 3 时,排列如下:P A H NA P L S I I GY I R 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串, 比如:"PAHNAPLSIIGYIR"。举例示例 1:输入:s = "PAYPALISHIR...原创 2022-02-27 13:15:47 · 348 阅读 · 0 评论 -
LeetCode C++25-跳跃游戏
题目描述 leetcode原题出处:跳跃游戏 给定一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。举例示例1: 输入:nums = [2,3,1,1,4] 输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例2:输入:nums = [3,2,1,0,4] 输出:false解释:无论怎样...原创 2022-02-26 20:59:39 · 219 阅读 · 0 评论 -
LeetCode C++24-电话号码的字母组合
题目描述 leetcode原题链接:电话号码的字母组合 给定一个仅包含2-9的字符串,返回所有它能表示的字母组合。答案可以按任何顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。 举例示例 1:输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]示例 2:输入:digits = "" 输出:[]示例 3:输入:digits...原创 2022-02-26 00:11:56 · 457 阅读 · 1 评论 -
LeetCode C++23-在排序数组中查找元素的第一个和最后一个位置
题目描述 leetcode原题链接:在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值,返回 [-1, -1]。举例示例1: 输入:nums = [5,7,7,8,8,10] target=8 输出:[3,4]示例2: 输入: nums = [5,7,7,8,8,10] target=6 输出:[-1,-1]示例3: 输入: [] 输出:...原创 2022-02-24 22:50:27 · 647 阅读 · 0 评论 -
LeetCode C++22-搜索旋转排序数组
题目描述 (leetcode题目链接:搜索旋转数组) 整数数组 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] 在下标...原创 2022-02-23 23:25:47 · 354 阅读 · 0 评论 -
LeetCode C++21-组合总和
题目描述 给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:(1)所有数字(包括target)都是正整数。(2)解集不能包含重复的组合。举例示例一:输入: candidates = [2,3,6,7], target = 7输出: [ [7], [2,2,3] ]示例二:输入:candidates = [2,5...原创 2022-02-22 23:46:40 · 506 阅读 · 0 评论 -
LeetCode C++20-编辑距离
题目描述 给你两个单词word和word2,请返回将word1转换成word2所使用的最小操作数。你可以对一个单词进行如下三种操作:(1)插入一个字符;(2)删除一个字符;(3)替换一个字符;举例 示例1: 输入: word1="horse", word2="ros" 输出:3 示例2: 输入: word1="intention", word2="execution" 输出:5解题方法:动态规划。代码#include <iostre...原创 2022-02-21 22:25:01 · 247 阅读 · 0 评论 -
LeetCode C++19-括号生成
题目描述 数字n代表成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。举例示例1: 输入: n = 3, 输出: ["((()))", "(()())", "(())()", "()(())", "()()()"]示例2: 输入: n = 1, 输出: ["()"]解题方法: 递归法。 (generate(k))generate(n-k-1) ==> generate(k)表示生成k对括号的...原创 2022-02-21 21:18:26 · 353 阅读 · 0 评论 -
LeetCode C++18-颜色分类
题目描述 给定一个包含红色、白色和蓝色、共n个元素的数组nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们用整数0、1和2分别表示红色、白色和蓝色。注意:必须在不使用库的sort函数的情况下解决这个问题。举例示例1:输入: nums=[2,0,2,1,1,0] 输出: [0,0,1,1,2,2]示例2:输入: nums=[2,0,1] 输出:[0,1,2]解题方法: 双指针代码...原创 2022-02-21 16:42:35 · 474 阅读 · 0 评论 -
LeetCode C++17-删除链表的倒数第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]解题方法: 快慢指针+哨兵节点。始终保持fast指针跟slow指针的距离为n+1,当fast指针到最后一个节点时,slow节点正好位于倒数第N个节点的前一个节点的位置。代码...原创 2022-02-20 22:31:56 · 551 阅读 · 0 评论 -
LeetCode C++16-合并K个升序链表
题目描述 给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序的链表中,返回合并后的链表。示例1:输入: lists: 1->4->5, 1->3->4, 2->6输出: 1->1->2->3->4->4->5->6示例2:输入: []输出:[]示例3:输入: [[]]输出: []解题方法:最小堆实现。用小顶堆保存每个链表当前遍历到的最小元素,每次弹出栈顶...原创 2022-02-19 22:41:34 · 577 阅读 · 0 评论 -
LeetCode C++15-有效的括号
题目描述 给定一个只包括( } { } [ ]的字符串s,判断字符串是否有效。有效的字符串需满足:1. 左括号必须用相同类型的右括号闭合;2.左括号必须以正确的顺序闭合。示例:1: 输入:s = "()" 输出: true2: 输入:s="()[]{}" 输出:true3: 输入:s="(]" 输出:true4: 输入:s="([)]" 输出:false5: 输入:s="{[]}" 输出:true解题方法:...原创 2022-02-19 20:30:54 · 318 阅读 · 0 评论 -
LeetCode C++14-盛最多水的容器
题目描述 给定n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i, ai)。在坐标内画n条垂直线,垂直线i的两个端点分别为(i, ai)和(i,0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳更多的水。说明:你不能倾斜容器,且n的值至少为2。举例:输入: [1,8,6,2,5,4,8,3,7] 输出:49解题方法: 双指针 + 贪心比较。代码#include <iostream>#include <vector>...原创 2022-02-19 19:56:53 · 282 阅读 · 0 评论 -
LeetCode C++13-接雨水
题目描述 给定n个非负整数表示每个宽度为1的柱子的高度图就,计算按此排列的柱子,下雨之后能接多少雨水。举例: 输入:nums={3, 1, 0, 2, 1} 输出:3解题思路:双指针。左右两个指针left和right同时扫描数组,用两个变量记录当前左右两边的最大值lmax和rmax,然后比较lmax和rmax,将小一边计算当前的接雨量,同时更新对应的运行指针。代码#include <iostream>#include <ve...原创 2022-02-19 18:47:33 · 369 阅读 · 0 评论 -
LeetCode C++12-从前序遍历和中序遍历序列构造二叉树
题目描述 给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回根节点。示例:如上图所示,先序遍历数组:[1, 2, 4, 5, 3],中序遍历数组: [4, 2, 5, 1, 3]代码#include <iostream>#include <vector>struct TreeNode { int value; TreeNode* lchild...原创 2022-02-17 07:50:45 · 302 阅读 · 0 评论 -
LeetCode C++11-下一个更大元素II
题目描述 给定一个循环数组nums,数组的大小为n,第n个元素的下一个元素为第一个元素,返回nums中每个元素的下一个更大元素。 数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出-1。举例示例1: 输入: nums=[1, 2, 1] 输出: [2, -1, 2] 说明: 1的下一个元素是2;2没有下一个元素,为-1;示例2:输入:nums=[1...原创 2022-02-14 23:24:50 · 476 阅读 · 0 评论 -
LeetCode C++10-K个一组翻转链表
问题描述 给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有的顺序。举例示例1: 输入:1->2->3->4->5 k=2 输出:2->1->4->3->5示例2: 输入:1->2->3->4->5 k=3 输出:3->2->1->4->5示例3: 输入:1-&...原创 2022-02-13 21:45:50 · 553 阅读 · 0 评论 -
LeetCode C++9-下一个排列
题目描述给你一个整数数组nums,找出nums的下一个排列。要求:必须原地修改,只允许使用额外常数空间。举例示例1:nums=[1,2,3] ==> 输出:[1,3,2]示例2:nums=[3,2,1] ==> 输出:[1,2,3]示例3:nums=[1,1,5]==> 输出:[1,5,1]解题方法:假设数组的大小为n,先从右向左寻找第一个降序的数字,假设其下标为i,再在区间[i+1, n-1]从右向左寻找第一个比nums[i]大的数,与nums[i]交换。交换原创 2022-02-13 18:08:40 · 265 阅读 · 0 评论 -
LeetCode C++8-最长有效括号
题目描述 给你一个包含'('和')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。解题思路:采用数据结构-栈。遍历字符串,当遇到"("时,将下标压入栈中;遇到右括号,则弹出栈顶的左括号,并用当前右括号的下标离栈顶元素(弹出后的栈顶元素)下标的距离来更新最大的有效程度。代码#include <iostream>#include <string>#include <stack>int max_parenthesis_le...原创 2022-02-13 17:20:07 · 520 阅读 · 0 评论 -
LeetCode C++7-两数相加
题目描述给你两个非空的链表,表示两个非负的整数。它们每位数都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除数字0之外,这两个数都不会以0开头。举例:e.g.1: 输入: l1 = 2->4->3, l2= 5->6->4, 输出:l=7->0->8e.g.2: 输入:l1=0, l2=0, 输出:l=0e.g.3: 输入: l1=9->9->9->9->9-原创 2022-02-12 13:35:44 · 473 阅读 · 0 评论 -
LeetCode C++6-三数之和
题目描述给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b, c,使得a+b+c=0 ?请你找出所有和为0且不重复的三元组。举例:e.g.1 输入:nums={-1, 0, 1, 2, -1, 4}输出: [{-1,-1,2}, {-1,0,1}]e.g.2 输入:nums =[] 输出: []e.g.3 输入: nums[0] 输出: []解题方法: 排序 + 双指针代码代码输出如下:...原创 2022-02-11 22:03:07 · 447 阅读 · 0 评论 -
LeetCode C++5-寻找两个正序数组的中位数
题目描述给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。要求算法的时间复杂度为O(log(m+n))举例:eg1. 输入: nums1=[1,3], nums=[2] 输出:2.0000eg2. 输入:nums1=[1,2], nums2=[3,4] 输出:2.5解题方法:二分查找,假设nums1的元素个数和nums2的元素个数的和为 n。 若n为奇数,中间数为nums1和nums2合并后的第 ( n / 2 + 1)个数;若n原创 2022-02-11 20:19:25 · 370 阅读 · 0 评论 -
LeetCode C++4-合并两个有序链表
题目描述将两个升序链表合并为一个新的升序链表并返回,新链表是通过拼接给定的两个链表的所有节点组成的。举例:输入1: head1= 1->2->4 head2=1->3->4 输出1:head = 1->1->2->3->4输入2: head1 = null, head2=null 输出:null输入3: head=null, head2=0 输出: 0解题方法: 算法本身没有难度,但是细节问题要处理好。代码...原创 2022-02-11 11:05:18 · 159 阅读 · 0 评论 -
LeetCode C++3-最长回文子串
题目描述:给你一个字符串s, 找到s中最长的回文子串。举例:eg.1 s = "babad" ==> "bab"eg.2 s = "cbbd" ==> "bb"eg.3 s = "aaabcdadcbabbb" ==> "abcdadcba"解题思路: 中心扩展法。将某一个字符,从中间向左右两端扩展,记录满足回文条件的最大的长度和对应的子串,并将最长的子串返回。代码如下:...原创 2022-02-10 22:22:31 · 251 阅读 · 0 评论 -
LeetCode C++2-无重复字符的最长子串
题目描述:给定一个字符s,请你找出其中不含有重复字符的最长子串的长度。示例:1)s="abcabcbb" ==> 32) s = "bbbbb" ==> 13)s = "pwwkew" ==> 34) s = "" ==> 0原创 2022-02-09 23:05:00 · 250 阅读 · 0 评论 -
LeetCode C++1-全排列II(不重复的全排列)
方法:回溯搜索#include <iostream>#include <string>#include <set>void backtrack(std::string str, int i) { int n = str.size(); if (i == n) { std::cout << str << std::endl; } std::set<char> chset;原创 2022-02-07 23:08:06 · 250 阅读 · 0 评论