数据结构与算法
文章平均质量分 53
数据结构与算法学习
七夜丶雪
听雪楼前听雪落,彼岸花开彼岸零
展开
-
LeetCode-905. 按奇偶排序数组
题目给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例:输入:[3,1,2,4]输出:[2,4,3,1]输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。解答最简单的方式就是对数组进行一次"排序", 这个排序自定义大小规则, 我们设定所有偶数都小于奇数,偶...原创 2018-10-22 14:01:37 · 417 阅读 · 0 评论 -
LeetCode-561. 数组拆分 I
题目给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。示例 1:输入: [1,4,3,2]输出: 4解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).提示:n 是正整数,范围在 [1, 10000].数...原创 2018-10-22 18:37:04 · 208 阅读 · 0 评论 -
LeetCode-867. 转置矩阵
题目给定一个矩阵 A, 返回 A 的转置矩阵。矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。示例 1:输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7],[2,5,8],[3,6,9]]示例 2:输入:[[1,2,3],[4,5,6]]输出:[[1,4],[2,5],[3,6]]提示:1 <= A.length <...原创 2018-10-23 10:20:54 · 395 阅读 · 0 评论 -
LeetCode-566. 重塑矩阵
题目在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。示例 1:输入:n...原创 2018-10-26 14:48:42 · 257 阅读 · 0 评论 -
LeetCode-717. 1比特与2比特字符
题目有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。示例 1:输入:bits = [1, 0, 0]输出: True解释:唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。示例 2:输入:bits ...原创 2018-10-26 15:21:59 · 302 阅读 · 0 评论 -
LeetCode-766. 托普利茨矩阵
题目如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True。示例 1:输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]输出: True解释:在上述矩阵中, 其对角线为:“[9]”, “[5, 5]”, “[1, 1, 1]”, “[...原创 2018-10-30 16:48:21 · 711 阅读 · 0 评论 -
LeetCode-169. 求众数
题目给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2解题这个就很简单, 使用一个Map保存数组, key为数组元素, value为数组中数字出现次数, 然后找出遍历map...原创 2018-10-30 17:08:38 · 339 阅读 · 0 评论 -
LeetCode-485. 最大连续1的个数
题目给定一个二进制数组, 计算其中最大连续1的个数。示例 1:输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意:输入的数组只包含 0 和1。输入数组的长度是正整数,且不超过 10,000。解题使用一个变量max记录连续1的最大个数遍历数次, 同时使用一个临时数组, 记录遍历过程中连续1的最大个数, 当...原创 2018-11-01 14:06:20 · 1630 阅读 · 0 评论 -
LeetCode-122. 买卖股票的最佳时机 II
题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交...原创 2018-11-01 14:37:46 · 266 阅读 · 0 评论 -
LeetCode-268. 缺失数字
题目给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。示例 1:输入: [3,0,1]输出: 2示例 2:输入: [9,6,4,2,3,5,7,0,1]输出: 8说明:你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?解题从示例来看,数组长度为n, 0…n总共有n+1个数, 简单来说对0…n求和减去...原创 2018-11-01 15:04:46 · 283 阅读 · 0 评论 -
LeetCode-121. 买卖股票的最佳时机
题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利...原创 2018-11-01 15:47:19 · 324 阅读 · 0 评论 -
LeetCode-896. 单调数列
题目如果数组是单调递增或单调递减的,那么它是单调的。如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。当给定的数组 A 是单调数组时返回 true,否则返回 false。示例 1:输入:[1,2,2,3]输出:true示例 2:输入:[6...原创 2018-11-01 18:31:53 · 533 阅读 · 0 评论 -
LeetCode-661. 图片平滑器
题目包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。示例 1:输入:[[1,1,1],[1,0,1],[1,1,1]]输出:[[0, 0, 0],[0, 0, 0],[0, 0, 0]]解释:对于点 (0,0)...原创 2018-11-02 14:39:06 · 304 阅读 · 0 评论 -
LeetCode-167. 两数之和 II - 输入有序数组
题目给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], t...原创 2018-11-02 16:07:10 · 342 阅读 · 0 评论 -
LeetCode-695. 岛屿的最大面积
题目给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为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,...原创 2018-11-06 21:01:03 · 541 阅读 · 0 评论 -
LeetCode-448. 找到所有数组中消失的数字
题目给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]解题首先遍历一...原创 2018-11-07 07:53:18 · 527 阅读 · 0 评论 -
LeetCode-283. 移动零
题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解题首先,使用一个变量nonZeroIndex记录非零元素的索引位置, 设定[0, nonZeroIndex]前开后闭区间元素都非0对数组...原创 2018-10-31 10:54:05 · 237 阅读 · 0 评论 -
LeetCode-119. 杨辉三角 II
题目给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 3输出: [1,3,3,1]进阶:你可以优化你的算法到 O(k) 空间复杂度吗?解题这题使用滚动数组来进行求解, 就拿上面的题目来说, 将其转换成数组来表示如下, 其中没有元素的地方在后面补0:行数数组值第一行1, 0...原创 2018-11-07 06:42:18 · 254 阅读 · 0 评论 -
LeetCode-118. 杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:入: 5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]解答观察图片可以看出有如下规律, 第一行就是一个1, 下面的每一行的元素arr[i]=prev[i - 1] + prev[i]; prev表示上...原创 2018-10-23 10:54:18 · 450 阅读 · 0 评论 -
LeetCode-27. 移除元素
题目给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个...原创 2018-11-01 13:52:32 · 441 阅读 · 0 评论 -
高级排序-堆排序
概述堆排序其实就是利用堆这种数据结构的特性进行排序, 关于堆的特性, 可以参考 : https://blog.csdn.net/love905661433/article/details/82989404代码实现这里实现一个简单的最大堆, 然后使用最大堆进行排序, 由于只是用来排序, 这里就直接使用一个只支持int类型的堆, 代码如下:package sort.heap;import ...原创 2018-10-22 10:40:32 · 154 阅读 · 0 评论 -
高级排序-快速排序详解
辅助工具数组工具类 : https://blog.csdn.net/love905661433/article/details/83106078用于比较的归并排序代码 : https://blog.csdn.net/love905661433/article/details/83118153概述快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排...原创 2018-10-18 12:34:11 · 706 阅读 · 1 评论 -
高级排序算法-归并排序
辅助工具数组工具类代码 : https://blog.csdn.net/love905661433/article/details/83106078用于对比的基础排序代码 : https://blog.csdn.net/love905661433/article/details/83117977归并排序O(nlogn)级别算法需要额外的辅助空间稳定的排序算法对于排序算法稳定性的定...原创 2018-10-17 21:36:14 · 191 阅读 · 0 评论 -
排序算法-基础排序算法(冒泡, 选择, 插入)
辅助工具数组工具类代码 : https://blog.csdn.net/love905661433/article/details/83106078选择排序O(n²)级别算法以从小到大排列为例, 每次循环找到剩余未排序数组中最小的值, 和为排序数组的第一个位置交换位置如针对数组[3, 4, 1, 8, 7], 排序步骤如下:第一次循环结束 : [1, 4, 3, 8, 7]...原创 2018-10-17 21:23:19 · 210 阅读 · 0 评论 -
排序辅助测试-数组工具类
数组工具类数组工具类, 为了方便对排序进行测试, 工具定义了一些便利的方法生成随机int型数组生成一个近乎有序或者完全有序的数组判断一个int型数组是否是从小到大排好序的交换int型数组中两个元素位置数组打印返回排序算法时间数组拷贝, 拷贝一个同样的int型数组对数组arr的[l, r]的区间进行插入排序package utils;import java.util....原创 2018-10-17 10:39:56 · 429 阅读 · 0 评论 -
数据结构-平衡二叉树之AVL树
概述二分搜索树 : https://blog.csdn.net/love905661433/article/details/82981527针对普通的二分搜索树, 在最坏的情况下可能会退化成链表, 所以就引入了平衡二叉树的概念平衡二叉树满二叉树一定是平衡二叉树完全二叉树也是平衡二叉树对于任意一个节点, 左子树和右子树的高度差不能超过1平衡二叉树的高度和节点数量之间的关系是O(log...原创 2018-10-14 19:53:19 · 309 阅读 · 0 评论 -
数据结构-并查集
并查集一种特殊的树, 由子节点执行父节点方便解决连接问题主要操作union(p,q)用于合并p, q所在的集合isConnected(p,q)判断p,q是否相连代码实现首先先定义并查集的接口, 接口定义如下:package tree.uf;/** * 并查集接口 * @author 七夜雪 * */public interface UF { /**...原创 2018-10-13 11:06:26 · 270 阅读 · 0 评论 -
数据结构-线段树
线段树特点线段树不是完全二叉树线段树是平衡二叉树对于给定区间, 支持更新和查询操作 :更新 : 更新区间中的一个元素或者一个区间的值查询 : 查询一个区间[i, j]的最大值, 最小值, 或者区间数字和使用数组构建线段树如下图所示数组A, 以求和为例, 根节点A[0-7]存放的就是A[0-3]节点和A[4-7]节点之和, 下面的每个节点存放的值都是该节点对应左右孩子节点的...原创 2018-10-11 09:31:16 · 305 阅读 · 0 评论 -
数据结构-优先队列
优先队列普通队列 : 先进先出(FIFO); 后进后出优先队列 : 出队顺序和入队顺序无关, 和优先级相关使用最大堆可以很方便的实现优先队列, 代码如下 :package queue;import heap.MaxHeap ;/** * 使用最大堆实现优先队列 * @author 七夜雪 * * @param <E> */public class Pri...原创 2018-10-09 21:52:55 · 347 阅读 · 0 评论 -
数据结构-最大堆
堆二叉堆(Binary Heap)二叉堆是一颗完全二叉树堆中某个节点的值总是大于等于(或小于等于)其子节点, 对应的就是最大堆和最小堆可以用数组存储二叉堆, 数组下标以1开始,可以如下展示 :数组从0开始, 展示如下 :操作添加元素在数组的最后一个位置添加一个新元素新的元素进行上浮(Sift Up), 上浮操作如下图:取出元素堆每次只能取出最大的元...原创 2018-10-09 21:40:45 · 4750 阅读 · 2 评论 -
数据结构-映射
存储键值(Key, Value)数据对的数据结构根据键(Key),寻找值(Value)非常容易使用链表或二分搜索树进行实现Java中的HashMap和TreeMap底层分别基于哈希表和红黑树进行实现代码实现 :package map;/** * 使用二分搜索树实现Map * @author 七夜雪 * * @param <K> * @param <V&...原创 2018-10-09 16:41:02 · 655 阅读 · 0 评论 -
数据结构-使用二分搜索树实现集合(Set)
概述集合不能添加重复元素可以使用二分搜索树很方便的实现集合集合的典型应用 :客户统计词汇量统计代码实现集合可以很方便的使用二分搜索树进行实现, 现在引用上面实现的二分搜索树实现集合集合接口定义 :package set;public interface Set&lt;E extends Comparable&lt;E&gt;&gt; { /** * 集合中添加...原创 2018-10-09 14:29:51 · 257 阅读 · 0 评论 -
数据结构-二分搜索树(Binary Search Tree)
特点动态数据结构是一颗二叉树二分搜索树的每个节点的值:每个节点的值都大于其左子树的所有节点的值每个节点的值都小于其右子树的所有节点的值每一颗子树也是二分搜索树存储的元素必须有可比较性, Java中的话就要求二分搜索树保存的数据类型要实现Comparable接口, 或者使用额外的比较器实现一般二分搜索树不包含重复元素, 当然也可以定义包含重复元素的二分...原创 2018-10-09 14:08:28 · 9319 阅读 · 3 评论 -
线性结构-动态数组
数组是最简单的线性结构, 不过数组都是固定长度的, Java实现一个功能类似于ArrayList的动态数组package array;/** * 动态数组 * @author qiyexue * @param <E> */public class Array<E> { private int size; private E[] data; pu...原创 2018-09-30 14:44:11 · 250 阅读 · 0 评论 -
线性结构-栈
栈的特点线性结构栈对应的操作是数组的子集只能从一端添加元素, 也只能从一端取出元素只能从栈顶操作入栈,出栈;又叫压栈和弹栈后进先出Last In First Out(LIFO)栈的应用Undo操作(撤销)程序调用系统栈, jvm方法区中的栈帧括号匹配-编译器实现一个栈这里使用了自己创建的动态数组, 具体代码参加博文:https://blog.csdn.net/lov...原创 2018-09-30 14:54:06 · 335 阅读 · 0 评论 -
线性结构-队列
队列特点线性结构队列对应的操作也是数组的子集只能从一端(队尾)添加元素,另一端(队首)取出元素先进先出(FIFO : First In First Out)实现自己的队列基于自己实现的动态数组实现队列,源码地址 :https://blog.csdn.net/love905661433/article/details/82909334同样可以使用JDK自带的ArrayList进行替...原创 2018-09-30 15:08:34 · 642 阅读 · 0 评论