算法
橙子慢慢学
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode215.数组中的第k个最大的元素
题目描述:在未排序的数组中找到第 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 ≤ 数组的长度。解题思路:这里用的是快速排序,可以去看看官方解题的快速排序+随机数(加入随机数可以解决最坏情况),一开始快速排序的思路写的代码重复语句比较原创 2021-06-20 14:21:57 · 237 阅读 · 0 评论 -
汉诺塔的递归算法
汉诺塔的递归算法原创 2022-08-24 18:06:35 · 244 阅读 · 0 评论 -
Leetcode154.寻找旋转排序数组中的最小值II
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个可能存在 重复 元素值的数组 nu原创 2021-12-25 16:24:06 · 139 阅读 · 0 评论 -
LeetCode347.前k个高频元素
题目描述:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:1 <= nums.length <= 105k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的**进阶:**你所设计原创 2021-12-25 16:23:47 · 307 阅读 · 0 评论 -
LeetCode 75.颜色分类
题目描述给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]示例 3:输入:nums = [0]输出:[0]示例 4:输入:nums = [1]输出:[1]提示:n == nums.le原创 2021-12-25 16:23:29 · 345 阅读 · 0 评论 -
LeetCode 547.省份数量
题目描述有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。示例 1:输入:isConnec原创 2021-12-25 16:22:57 · 126 阅读 · 0 评论 -
77.组合(回溯 + 剪枝)
题目描述:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]思路:回溯思路看4原创 2021-07-14 21:33:41 · 171 阅读 · 0 评论 -
LeetCode 451.根据字符出现频率排序
题目描述:给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入:“tree”输出:“eert”解释:'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。示例 2:输入:“cccaaa”输出:“cccaaa”解释:'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。示例 3:输入:“Aabb”输出:“原创 2021-07-14 20:24:49 · 97 阅读 · 0 评论 -
LeetCode 695.岛屿的最大面积
题目描述:给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)示例 1:[[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],原创 2021-07-14 20:24:20 · 297 阅读 · 0 评论 -
417.太平洋大西洋水流问题(dfs)
题目:给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。提示:输出坐标的顺序不重要m 和 n 都小于150示例:给定下面的 5x5 矩阵:太平洋 ~ ~ ~ ~ ~1 2 2 3 (5) *3 2 3原创 2021-07-14 20:23:49 · 259 阅读 · 0 评论 -
31.下一个排列
题目:实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 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 = [1]输出:[1]提示:1 <= nums.l原创 2021-07-14 20:23:03 · 106 阅读 · 0 评论 -
47.全排列II
题目:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例 1:输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]示例 2:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]提示:1 <= nums.length <= 8-10 <= nums[i] <= 10思路:主要用的是第31题的思想,把题目原创 2021-07-14 20:22:30 · 124 阅读 · 0 评论 -
996.正方形数组的数目(回溯+剪枝)
题目描述:给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。返回 A 的正方形排列的数目。两个排列 A1 和 A2 不同的充要条件是存在某个索引 i,使得 A1[i] != A2[i]。示例 1:输入:[1,17,8]输出:2解释:[1,8,17] 和 [17,8,1] 都是有效的排列。示例 2:输入:[2,2,2]输出:1提示:1 <= A.length <= 120 <= A[i] <= 1e9思路:整体思原创 2021-07-14 20:21:52 · 343 阅读 · 0 评论 -
LeetCode69 x的平方根
题目详情:实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。解题思路:解题用的是二分法,其实方法很简单,直接看代码就能懂,但是就是溢出问题有点难想到,当进行乘法运算时,如果给的用例很大(2^31 - 1 整型int的最大范围了)时,就会发生溢原创 2021-06-09 17:04:53 · 91 阅读 · 0 评论 -
贪心算法:leetcode455. 分发饼干
题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。解题思路:这里我用贪心算法:先将g和s从小到大排序,然后把最小的饼干尺寸给胃口最小(不过胃口一定要小于等于当前这个最小饼干原创 2021-05-19 22:11:08 · 218 阅读 · 0 评论 -
算法:两数之和(暴破)
题目描述:给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解例如:给出的数组为 {20, 70, 110, 150},目标值为90输出 index1=1, index2=2输入:[3,2,4],6输出:[2,3]思路:暴破:就直接判断数组中有没有元素等于target - numb原创 2021-05-19 15:41:11 · 108 阅读 · 0 评论 -
算法:最小的k个数(冒泡排序)
题目描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组输入:[4,5,1,6,2,7,3,8],4输出:[1,2,3,4]解题思路:本来是想用堆排序的,但算了下堆排序复杂度O(nlogn),我用冒泡部分排序复杂度O(4n)(不知道我又没有算错[鬼鬼祟祟]),所以用了冒泡排序代码:class Solution {public: v原创 2021-05-18 21:44:31 · 444 阅读 · 0 评论 -
算法:寻找数组中心下标
题目描述:给定一个整数数组nums,请编写一个能够返回数组“中心下标”的方法。中心下标:左侧所有元素相加的和等于右侧所有元素相加的和如果数组不存在中心下标,则返回-1;如果数组有多个(两个)中心下标,则返回最靠近左边的中心下标...原创 2021-05-17 10:09:57 · 449 阅读 · 0 评论 -
算法:(双指针)最长无重复子数组
题目描述:给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,2,3,4,5]的子数组有[1,2],[2,3,4]等等,但是[1,3,4]不是子数组思路:因为刚学了双指针,所以想用双指针做,后面以为也许可以用单指针,因为删除和子数组长度都可以用集合set.erase()和set.size()获得,可是用单指针做时,试着用set.erase(st.begin(),st.end());和set.clear();清空前一子数组时,运行都原创 2021-05-16 21:35:25 · 289 阅读 · 0 评论 -
算法:(双指针算法)删除排序数组中的重复项
题目:一个有序数组nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度也就是不能使用额外的数组空间输入:[0,1,2,2,3,3,4]输出: 5算法思想:使用两个指针: i = 0; j = 1;当nums[i] == nums[j] 时,i不动,j++当 nums[i] != nums[j] 时,把nums[j] 的值赋值给 nums[i + 1] ,并且i和j都向前移动删除后数组的新长度为 (i +1)代码如下: public static int原创 2021-05-16 17:02:50 · 194 阅读 · 0 评论 -
算法:统计n以内素数个数--埃筛法
埃式筛选法埃式筛选法主要用于筛选素数思想如果一个数为素数,那么这个素数的倍数一定是合数,从2、3开始,筛掉它们的倍数,那么出2、3外未被筛选掉的数中最小min的那个就是素数(2 * 3 = 6;已被筛掉,所以前面不可能有数可以被min整除了,即可推出min为素数),再筛掉min的所有倍数,以此类推代码如下 // 【埃筛法】 计算n以内素数的个数 public static int eratosthenes(int n){ // 初始化为false,false代表素数原创 2021-05-16 15:21:43 · 1146 阅读 · 0 评论 -
PTA:求链式表的表长
本题要求实现一个函数,求链式表的表长。函数接口定义:int Length( List L );其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LNode { ElementType Data; PtrToLNode Next;};typedef PtrToLNode List;L是给定单链表,函数Length要返回链式表的长度。裁判测试程序样例:#include <stdio.h>#include原创 2021-04-23 16:18:53 · 703 阅读 · 0 评论
分享