数据结构与算法
文章平均质量分 61
roseLin...
这个作者很懒,什么都没留下…
展开
-
算法 ---- 滑动窗口(双指针)
题目描述:解题思路:暴力解法:如果一个问题暂时没有思路,可以先考虑暴力解法(不一定要实现)。当前问题的暴力解法是:枚举输入字符串的 所有 子串,对于每一个子串:如果子串里所有的字符都一样,就考虑长度更长的子串;如果当前子串里出现了至少两种字符,要想使得替换以后所有的字符都一样,并且重复的、连续的部分更长,应该替换掉出现次数最多字符 以外 的字符。暴力解法的时间复杂度为 O(N3)(这里 N 是输入字符串的长度,枚举所有子串 O(N2),对于每一个子串计算最多出现的字符 O(N))原创 2021-02-22 09:46:25 · 258 阅读 · 0 评论 -
算法 ---- 翻转数组
题目描述:给定一个数组,将数组中的元素向右移动 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,原创 2021-02-22 09:41:03 · 1825 阅读 · 0 评论 -
leetcode刷题打卡 ---- 697数组的度
题目描述:给定一个非空且只包含非负数的整数数组 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,原创 2021-02-20 16:55:31 · 245 阅读 · 0 评论 -
leetcode刷题打卡 ---- 643子数组最大平均数
题目描述:给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。示例:输入:[1,12,-5,-6,50,3], k = 4输出:12.75解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75提示:1 <= k <= n <= 30,000。所给数据范围 [-10,000,10,000]。解题思路:首先会直接想到暴力法来解题,将数组中所有可能的子数组结果计算出其平均值,然后找出最大的那个平均值。class So原创 2021-02-04 14:33:05 · 138 阅读 · 0 评论 -
leetcode刷题打卡 ---- 888公平的糖果棒交换
题目描述:爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j] 是鲍勃拥有的第 j 根糖果棒的大小。因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。如果有多个答案,你可以返回其中任何一个。保证答案存在。示例 1:输入:A = [1,1], B = [2原创 2021-02-01 14:46:28 · 78 阅读 · 0 评论 -
leetcode刷题打卡 ---- 724寻找数组的中心索引
题目描述:给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。示例 1:输入:nums = [1, 7, 3, 6, 5, 6]输出:3解释:索引 3 (nums[3] = 6) 的左侧数之和 (1 + 7 + 3 = 11),与右侧数之和 (5 + 6 = 11)原创 2021-01-28 15:44:06 · 80 阅读 · 0 评论 -
leetcode刷题打卡 ---- 1128等价多米诺骨牌对的数量
题目描述:给你一个由一些多米诺骨牌组成的列表 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 12:40:56 · 95 阅读 · 1 评论 -
JDK8中 Arrays.sort 底层排序算法的选择
追到底层源码分析一下:// Use Quicksort on small arraysif (right - left < QUICKSORT_THRESHOLD){ //QUICKSORT_THRESHOLD = 286 sort(a, left, right, true); return; }数组一进来,会碰到第一个阀值QUICKSORT_THRESHOLD(=286),注解上说,小于这个阀值的进入Quicksort (快速排序),其实并不转载 2021-01-20 17:40:24 · 281 阅读 · 0 评论 -
leetcode刷题打卡 ----628三个数的最大乘积
题目描述:给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例 1:输入: [1,2,3]输出: 6示例 2:输入: [1,2,3,4]输出: 24注意:给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。解题思路:首先是对nums进行排序,然后就是输出最大值:一定是 三个最大正数乘积 与 两个最小负数和最大正数的乘积 的最大值关于排序,我最先想到的是常用的冒泡原创 2021-01-20 16:04:15 · 83 阅读 · 0 评论 -
leetcode刷题打卡 ----189旋转数组
题目描述:给定一个数组,将数组中的元素向右移动 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,原创 2021-01-08 12:17:35 · 155 阅读 · 0 评论 -
leetcode刷题打卡 ----830较大分组的位置
题目描述:在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。例如,在字符串 s = “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的一些分组。分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 “xxxx” 分组用区间表示为 [3,6] 。我们称所有包含大于或等于三个连续字符的分组为 较大分组 。找到每一个 较大分组 的区间,按起始位置下标递增原创 2021-01-05 10:03:29 · 51 阅读 · 0 评论 -
leetcode刷题打卡 ---- 605种花问题
题目描述:假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。示例 1:输入:flowerbed = [1,0,0,0,1], n = 1输出:true示例 2:输入:flowerbed = [1,0,0原创 2021-01-04 12:58:25 · 100 阅读 · 0 评论 -
leetcode刷题打卡 ---- 509斐波那契数
题目描述:斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给你 n ,请计算 F(n) 示例 1:输入:2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1示例 2:输入:3输出:2解释:F(3) = F(2) + F(1) = 1 + 1 = 2示例转载 2021-01-04 10:42:12 · 145 阅读 · 0 评论 -
leetcode刷题打卡 ---- 435无重叠区间
题目描述:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。示例 1:输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。示例 2:输入: [ [1,2], [1,2], [1,2] ]输出: 2解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。示例 3:输入: [原创 2020-12-31 12:14:36 · 103 阅读 · 0 评论 -
数据结构与算法 ------ 打卡第五天 递归
1. 递归1.1 递归的概念递归:即方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用机制:案例1:打印问题代码:public class RecursionTest { public static void main(String[] args) { // TODO Auto-generated method stub //通过打印问题,回顾递归调用机制 test(4); } //打印问题. public sta原创 2020-12-30 12:24:40 · 266 阅读 · 0 评论 -
leetcode刷题打卡 ---- 1046最后一块石头的重量
题目描述:有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。示例:输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,所以原创 2020-12-30 10:37:22 · 151 阅读 · 2 评论 -
leetcode刷题打卡 ---- 330按要求补齐数组
题目描述:给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。示例 1:输入: nums = [1,3], n = 6输出: 1 解释:根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4。现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3],原创 2020-12-29 14:38:40 · 281 阅读 · 0 评论 -
leetcode刷题打卡 ---- 135分发糖果
题目描述:老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示例 2:输入: [1,2,2]输出: 4解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。原创 2020-12-24 12:34:49 · 130 阅读 · 0 评论 -
leetcode刷题打卡 ---- 387字符串中的第一个唯一字符
题目描述:给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = "leetcode"返回 0s = "loveleetcode"返回 2提示:你可以假定该字符串只包含小写字母。解题思路:思路一:【最容易想到】定义一个数组来存储每个字符出现的次数,一共会遍历两次,第一次遍历计算每个字符出现的次数,第二次遍历查找只出现一次的字符,如果该字符存在直接返回字符下标。思路二:跟思路一的想法差不多,但不用数组统计每个字符出现的次数,而是用Has原创 2020-12-23 11:11:23 · 96 阅读 · 0 评论 -
数据结构与算法 ------ 打卡第四天 栈
1. 栈 stack1.1 介绍栈:是一个 先入后出 (FILO-First In Last Out)的 有序列表。栈是一种 只能在线性表的同一端进行 元素的插入和删除的 特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top)另一端为固定的一端,称为栈底(Bottom)。栈的应用场景:子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将原创 2020-12-22 17:49:50 · 301 阅读 · 0 评论 -
leetcode刷题打卡 ---- 283移动零
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解题思路:定义两个指针 a、b,指针a一直在遍历原数组,指针a、b一起动,当指针b指向的元素为0时,b不能动,而a没有任何限制一直在遍历。当a遍历到的元素不为0时,a、b两指针元素交换,并且b++前进一位。然后又继续重复上述步骤,动态图如下:具原创 2020-12-22 12:43:54 · 56 阅读 · 0 评论 -
数据结构与算法 ------ 打卡第三天 链表
1. 链表链表( linked list) 是一种在物理上非连续、 非顺序的数据结构, 以节点的方式来存储,是链式存储。链表是有序的列表,但是它在内存中是存储如下:由图可知:每个节点包含 data 域, next 域:指向下一个节点.发现链表的 各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定.1.1 单链表1.1.1 介绍单向链表的每一个节点又包含两部分, 一部分是存放数据的变量data, 另一部分是指向下一个节点的指针next。原创 2020-10-14 14:26:08 · 111 阅读 · 0 评论 -
数据结构与算法 ------ 打卡第二天 队列
1. 队列1.1 生活实例公路上有一条单行隧道, 所有通过隧道的车辆只允许从隧道入口驶入, 从隧道出口驶出, 不允许逆行。因此, 要想让车辆驶出隧道, 只能按照它们驶入隧道的顺序, 先驶入的车辆先驶出, 后驶入的车辆后驶出, 任何车辆都无法跳过它前面的车辆提前驶出。1.2 队列的介绍队列是一个有序列表,可以用 数组 或是 链表 来实现。遵循 先入先出 的原则 (First In First Out,简称FIFO) :先存入队列的数据,要先取出后存入的要后取出队列的出口端叫作队原创 2020-09-27 15:55:36 · 86 阅读 · 0 评论 -
数据结构与算法 ------ 打卡第一天 线性结构和非线性结构
数据结构与算法 ------ 打卡第一天数据结构和算法的重要性:算法是程序的灵魂,优秀的程序可以在海量数据计算时,依然保持高速计算。1. 数据结构和算法概述数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构。学好数据结构可以编写出更加漂亮,更加有效率的代码。程序 = 数据结构 + 算法数据结构是算法的基础, 换言之,想要学好算法,需要把数据结构学到位2. 线性结构和非线性结构数据结构包括:**线性结构 **和 非线性结构2.1 线性原创 2020-09-24 14:11:29 · 157 阅读 · 0 评论