每天一道算法题
leetcode和一些经典算法题
I an
后端开发工程师
展开
-
SQL题:第二高的薪水
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。idsalary110022003300例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。SecondHighestSalary200题解1:使用子查询和limit...原创 2021-12-01 21:45:23 · 517 阅读 · 0 评论 -
百度一面算法题:柱状图的最大矩形面积
给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例:输入:heights = [2,1,5,6,2,3]输出:10 这是我在百度日常实习一面中面试官出的一道算法题,在此记录一下解题思路。 这道题的解题突破口是水桶模型,也就是说一个水桶能装多少水是取决于最短的那块木板的。这道题同理,我们需要找到直方图中最矮的column,但不是简单的找到整个柱状图中最短的column就完了,而是一原创 2021-11-26 15:13:08 · 818 阅读 · 0 评论 -
leetcode1838(最高频元素的频数:滑动窗口)
元素的频数是该元素在一个数组中出现的次数。给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。实例:输入:nums = [1,2,4], k = 5输出:3题解:滑动窗口 此题中只能对元素进行增加操作,最先能想到的思路是:对数组先进行排序,然后遍历数组中的每一个数字,每遍历到一个数字,就计算出该数字的最大可能频数,最后比较返回最大可能频数即可,但这样去操原创 2021-07-19 10:12:53 · 267 阅读 · 0 评论 -
leetcode773(滑动谜题:BFS广搜)
在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示.一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换.最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。给出一个谜板的初始状态,返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回 -1 。示例:输入:board = [[1,2,3],[4,0,5]]输出:1解释:交换 0 和 5 ,1 步完成输入:board = [[1,2,3],[5原创 2021-06-26 12:40:41 · 162 阅读 · 0 评论 -
leetcode31(下一个排列:两边扫描)
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]题解:两边扫描 使用两遍扫描的方式来找出数组nums的下一个更大的排列,步骤如下: 1. 找出与数组末尾相连,从后往前的最大升序子数组(nums[ i ]>=nums[ i+1]),将指针left标记到该子数组左边界的左原创 2021-06-22 10:46:19 · 99 阅读 · 0 评论 -
leetcode61(旋转链表:链表操作)
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]题解:链表操作这道题的本质其实是将链表末尾的倒数K个数截断,然后接到链表的开头,我们只需要遍历链表,找到链表的末尾K个数,然后进行相关操作即可。class Solution { public ListNode rotateRight(ListNode head, int k) { ListNode原创 2021-03-27 21:41:37 · 117 阅读 · 0 评论 -
leetcode132(分割回文串II:动态规划)
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。例:输入:s = “aab”输出:1解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。题解:动态规划 先利用动态规划对字符串进行预处理,找出回文串中所有的回文子串。然后继续利用动态规划方法,用int [ ]min 记录字符串前i个字符的最少分割次数(i=0,1,2,3…min原创 2021-03-08 20:14:11 · 180 阅读 · 0 评论 -
leetcode131(分割字符串:动态规划预处理+回溯)
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。输入: “aab”输出:[[“aa”,“b”],[“a”,“a”,“b”]]题解:动态规划预处理+回溯 采用动态规划的方法对字符串进行预处理,找出其中所有的回文子串,然后利用回溯算法枚举所有的分割方案,将不满足每个子串都是回文串的方案排除在外。class Solution { List<List&l原创 2021-03-07 11:20:00 · 522 阅读 · 0 评论 -
leetcode338(比特位计数:动态规划)
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]题解:动态规划 从小到大遍历范围中的数字,当前二进制数中1的个数,就是除去最低位后剩下的二进制数中1的个数加上1(最低位是1)或0(最低位是0)...原创 2021-03-03 12:57:53 · 178 阅读 · 1 评论 -
leetcode303(区域和检索 - 数组不可变:前缀和)
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。实现 NumArray 类:NumArray(int[] nums) 使用数组 nums 初始化对象int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], … , nums[j]))题解:前缀和 &n原创 2021-03-01 08:45:47 · 134 阅读 · 0 评论 -
leetcode1438(绝对差不超过限制的最长连续子数组:堆+延迟删除)
给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。如果不存在满足条件的子数组,则返回 0 。示例:输入:nums = [8,2,4,7], limit = 4输出:2题解:堆+延迟删除 维护两个指针left、right构成滑动窗口,同时利用两个堆分别维护[left,right]范围内的最大值和最小值。当r原创 2021-02-22 11:01:44 · 323 阅读 · 0 评论 -
leetcode697(数组的度:哈希存储)
给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入:[1, 2, 2, 3, 1]输出:2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]最短连原创 2021-02-20 20:49:05 · 136 阅读 · 0 评论 -
leetcode995(K 连续位的最小翻转次数:贪心算法+差分数组优化)
在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。返回所需的 K 位翻转的最小次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。例:输入:A = [0,0,0,1,0,1,1,0], K = 3输出:3解释:翻转 A[0],A[1],A[2]: A变成 [1,1,1,1,0,1,1,0]翻转 A[4],A[5],A[6]: A变成 [1,1,1,1,1,0,0,0]翻转 A[原创 2021-02-19 21:17:22 · 231 阅读 · 0 评论 -
leetcode566(重塑矩阵:二维数组向一维转化)
在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。示例 1:输入:nums =[[1,2],[3,4]]r = 1, c = 4输出:[[1,2,3,4]]解释:行遍历num原创 2021-02-17 20:10:53 · 351 阅读 · 0 评论 -
leetcode448(找到所有数组中消失的数字:哈希)
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]题解:哈希 遍历数组,利用哈希表存储数组中出现的数字,找原创 2021-02-13 11:02:57 · 201 阅读 · 0 评论 -
leetcode567(字符串的排列:滑动窗口)
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。示例1:输入: s1 = “ab” s2 = “eidbaooo”输出: True解释: s2 包含 s1 的排列之一 (“ba”).题解:滑动窗口用哈希表记录s1中出现的字符...原创 2021-02-10 16:07:01 · 269 阅读 · 0 评论 -
leetcode665(非递减数列:数组遍历)
给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。示例 1:输入: nums = [4,2,3]输出: true解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。题解:数组遍历 对于一个非递减数列,当原创 2021-02-07 10:56:53 · 231 阅读 · 0 评论 -
leetcode1423(可获得的最大点数:滑动窗口)
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。你的点数就是你拿到手中的所有卡牌的点数之和。给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。示例 1:输入:cardPoints = [1,2,3,4,5,6,1], k = 3输出:12解释:第一次行动,不管拿哪张牌,你的点数总是 1 。但是,先拿最右边的卡牌将会最大化你的可获得点数。最优策略是原创 2021-02-06 11:04:01 · 190 阅读 · 0 评论 -
leetcode1208(尽可能使字符串相等:滑动窗口)
给你两个长度相同的字符串,s 和 t。将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。示例 1:输入:s原创 2021-02-05 11:58:43 · 155 阅读 · 0 评论 -
leetcode424(替换后的最长重复字符:滑动窗口)
给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。注意:字符串长度 和 k 不会超过 104。输入:s = “AABABBA”, k = 1输出:4解释:将中间的一个’A’替换为’B’,字符串变为 “AABBBBA”。子串 “BBBB” 有最长重复字母, 答案为 4。题解:滑动窗口设置两个指针left、right,指向字符串的起点,同时用一个数组存储每个英文字母出现的次数,记录最大的出现原创 2021-02-02 20:43:51 · 212 阅读 · 0 评论 -
leetcode1631(最小体力消耗路径:最短路径算法)
你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。请你返回从左上角走到右下角的原创 2021-01-29 17:23:38 · 1011 阅读 · 0 评论 -
leetcode1128(等价多米诺骨牌对的数量:二元组映射)
给你一个由一些多米诺骨牌组成的列表 dominoes。如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a == c 且 b == d,或是 a == d 且 b == c。在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对原创 2021-01-26 13:14:55 · 158 阅读 · 0 评论 -
leetcode1584(连接所有点的最小费用:Kruskal算法)
给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。例:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]输出:20题解:Kruskal算法原创 2021-01-20 21:31:21 · 316 阅读 · 0 评论 -
leetcode947 (移除最多的同行或同列石头:并查集)
n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n 的数组 stones ,其中 stones[i] = [xi, yi] 表示第 i 块石头的位置,返回可以移除的石子 的最大数量。输入:stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]输出:5解释:一种移除 5 块石头的方法如下所示:移除石头 [2,2] ,因为它和 [2,1] 同行原创 2021-01-15 21:43:02 · 261 阅读 · 1 评论 -
leetcode1018(可被 5 整除的二进制前缀:遍历迭代)
给定由若干 0 和 1 组成的数组 A。我们定义 N_i:从 A[0] 到 A[i] 的第 i 个子数组被解释为一个二进制数(从最高有效位到最低有效位)。返回布尔值列表 answer,只有当 N_i 可以被 5 整除时,答案 answer[i] 为 true,否则为 false。示例 1:输入:[0,1,1]输出:[true,false,false]解释:输入数字为 0, 01, 011;也就是十进制中的 0, 1, 3 。只有第一个数可以被 5 整除,因此 answer[0] 为真。题解:循原创 2021-01-14 22:02:05 · 324 阅读 · 0 评论 -
leetcode684(冗余连接:并查集)
在本问题中, 树指的是一个连通且无环的无向图。输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。示例原创 2021-01-13 21:47:31 · 210 阅读 · 0 评论 -
leetcode547(省份数量:并查集)
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。输入:isConnected = [[1,原创 2021-01-07 10:06:15 · 415 阅读 · 1 评论 -
leetcode605(种花问题:贪心算法)
假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。示例 1:输入: flowerbed = [1,0,0,0,1], n = 1输出: True题解:贪心算法 遍历数原创 2021-01-01 17:18:37 · 380 阅读 · 0 评论 -
leetcode435(无重叠区间:贪心算法)
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。题解:贪心算法 我们按照顺序对区间集合中的区间数组进行排序,区间数组的左边界升序为排序的第一优先级,右边界的降序为第二优先级,排序完成后,对于相邻区间数组,若前一个区间的右边界大于后一个区间的左边界,说明这两个区间有重叠部分,这原创 2020-12-31 20:55:05 · 217 阅读 · 0 评论 -
leetcode84(柱状图中最大的矩形:单调栈)
给定 n 个非负整数,构成数组int[ ] heights用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。题解:单调栈。 我们以数组heights中的任意元素heights[ i ]为基准,向两边扩散,直到遇到高度小于height原创 2020-12-26 11:07:43 · 2442 阅读 · 0 评论 -
循环数组相邻元素为平方和(哈密顿回路+回溯)
找出最小的 n>1,使得存在一个存储了 [1, n] 的某个排列的循环数组,数组中任意相邻两项之和都是完全平方数。题解:构造一个无向图,循环数组中的每一个元素作为图中的点,图中的每一个点的值与它的邻接点的值相加为平方和,利用回溯法找图中的哈密顿回路(一次经过图中的所有点(只经过一次)并能回到出发点的回路)。我们逐渐增大图的大小,找图中的哈密顿回路,第一个能找到哈密顿回路的图大小即为最小的nclass Solution { public int getAns(){ for(i原创 2020-12-25 13:25:53 · 405 阅读 · 0 评论 -
leetcode135(分发糖果:二次遍历)
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现(数组 int [ ]rating),预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?题解:二次遍历,原题中“相邻的孩子中,评分高的孩子必须获得更多的糖果”这句话可以拆成两个规则:若某个孩子比他左手边的孩子评分高,则这个孩子获得的糖果数比他左手边的孩子多若某个孩子比他右手边的孩子原创 2020-12-24 16:39:32 · 451 阅读 · 1 评论 -
leetcode174( 买卖股票的最佳时机含手续费:动态规划)
给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。题解:动态规划,设置一个二维数组int [ ][ ]dp,dp[ i-1 ][0]表示第i天持有股票的情况下所能获得的利润最大值,dp[ i-1 ][1]原创 2020-12-17 21:18:09 · 97 阅读 · 0 评论 -
leetcode376( 摆动序列:动态规划)
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来原创 2020-12-12 13:24:15 · 134 阅读 · 1 评论 -
leetcode649(Dota2 参议院:循环队列)
Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。宣布胜利:如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D原创 2020-12-11 13:09:13 · 253 阅读 · 1 评论 -
leetcode659(分割数组为连续子序列:贪心算法)
给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。如果可以完成上述分割,则返回 true ;否则,返回 false 。题解:这道算法题的解题核心思路是贪心算法。对于数组中的元素x,我们所要做的就是将这个x放在已有的子序列尾,同时这个子序列尾的元素必须是x-1,如果有多个子序列的子序列尾的元素是x-1,为了满足每个子序列最终的长度都至少为3,我们需要优先将x放在长度最短且最后一个元素是x-1的子序列尾。如果当前不存原创 2020-12-09 09:18:37 · 321 阅读 · 0 评论 -
leetcode204(计数质数:埃氏筛)
统计所有小于非负整数 n 的质数的数量。题解一:枚举法,对于小于非负整数n的每一个数,都检查它是否为质数。class Solution { public int countPrimes(int n) { int ans = 0; for (int i = 2; i < n; ++i) { ans += isPrime(i) ? 1 : 0; } return ans; } //判断是否为原创 2020-12-03 17:31:21 · 185 阅读 · 0 评论 -
leetcode493(翻转对:归并排序)
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。示例 1:输入: [1,3,2,3,1]输出: 2示例 2:输入: [2,4,3,5,1]输出: 3题解(一):归并排序,在归并排序的过程中,假设对于某归并数组而言,我们已经分别求出了其左右子数组的翻转对数目,并已将左右子数组分别排好序,则该数组中的翻转对数目,就等于两个子数组的翻转对数目之和,加上翻转对左右端原创 2020-11-28 14:37:17 · 189 阅读 · 0 评论 -
leetcode164(最大间距:桶排序)
给定一个无序的数组nums,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。示例 1:输入: [3,6,9,1]输出: 3解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。题解:采用桶排序的算法,将数组范围区间(maxVal-minVal)等距离分成数个子区间,称为“桶”。 每个桶的原创 2020-11-26 15:01:52 · 212 阅读 · 0 评论 -
leetcode402(移掉K位数字:贪心算法)
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。输入: num = “1432219”, k = 3输出: “1219”解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。题解:贪心算法,对于任意一个数,一定是越靠前的数字越小,整个数字越小,为了让移除K位数字后的数尽量的小,我们可以采用贪心算法,遍历原字符串num,当num[ i ]<=num[ i+1 ]时,指针后移,当num[ i ]>num[ i+1 ]时,移除nu原创 2020-11-15 13:17:48 · 467 阅读 · 0 评论