算法
nurthless
我有两句话要刻于骨铭于心:
1. 战胜恐惧最好的方法是,直接面对恐惧;
2. 联想的能力,是我前行的捷径
展开
-
算法之寻找缺失的第一个整数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1思路:用一个数组记录已经出现的整数(因为要找的是缺失的最小整数,那么该整数最大也就是 给定数组的长度+1, 比如[1,2,3],最小缺失整数为4,而[1,3,4]中是2 ,不可能...原创 2019-01-25 03:12:11 · 565 阅读 · 0 评论 -
算法之接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6思路: 先找出 可以构成左低右高 的区域获得......原创 2019-01-25 05:13:32 · 2814 阅读 · 0 评论 -
算法之字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0...原创 2019-02-01 14:12:01 · 227 阅读 · 0 评论 -
算法之跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。思路:...原创 2019-02-04 16:19:16 · 497 阅读 · 0 评论 -
算法之全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]每次都尝试 把一个元素加到队列class Solution { List<List<Integer>>res=new ArrayList<Lis...原创 2019-02-05 11:02:46 · 113 阅读 · 0 评论 -
算法之旋转图像
给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例 2:给定 matrix ...原创 2019-02-08 09:56:59 · 766 阅读 · 0 评论 -
算法之计算某个数的二进制有多少个1
注意到,当前的数n 和 n-1 来与的话就可以干掉一个1,比如 111 和110 与得到11–少了一个1;100 和 011与的话是0 ,直接干掉1个1了int n=3; int count=0; while (n>0){ count++; n=n&(n-1); }...原创 2019-02-18 12:20:38 · 318 阅读 · 2 评论 -
算法之n皇后
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例:输入: 4输出: [[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”...原创 2019-03-01 02:04:26 · 145 阅读 · 0 评论 -
算法之最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。最简单做法:尝试所有地组合:class Solution { ...原创 2019-03-01 11:29:54 · 113 阅读 · 0 评论 -
算法之螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[[1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]]输出: [1,2,3,4,8,1...原创 2019-03-01 12:34:03 · 904 阅读 · 0 评论 -
算法之跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最...原创 2019-03-01 12:55:49 · 599 阅读 · 0 评论 -
算法之第k个序列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。示例 1:输入: n = 3, k = 3输出: “213...原创 2019-03-05 22:05:04 · 319 阅读 · 0 评论 -
算法之装几升水
最开始的问题:有两个杯子,一个6升(cup1)、一个5升(cup2),怎么样得到3升水?第一次:6升的杯子装满,然后倒进5升杯子里面,那么cup1=1,cup2=5;倒掉cup2中的所有-- cup2=0,然后将cup1中的转给cup2–cup2=1第二次:当前cup1=0,cup2=1(可以装5升,但现在已经装了1升);装满cup1=6,cup2=1; 将cup1的倒过去,cup1=2,cu...原创 2019-03-08 14:56:50 · 539 阅读 · 0 评论 -
算法之合并区间
给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。思路:先进行...原创 2019-03-03 17:36:42 · 2610 阅读 · 0 评论 -
算法之插入区间
给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例 1:输入: intervals = [[1,3],[6,9]], newInterval = [2,5]输出: [[1,5],[6,9]]示例 2:输入: intervals = [[1,2],[3,5],[6,7],[8,10],...原创 2019-03-04 13:02:44 · 527 阅读 · 0 评论 -
算法之最后单词长度
给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。说明:一个单词是指由字母组成,但不包含任何空格的字符串。示例:输入: “Hello World”输出: 5 class Solution { public int lengthOfLastWord(String s) { if(s==...原创 2019-03-04 13:32:51 · 113 阅读 · 0 评论 -
算法之求平方根
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。 //使用二分法 static class Solution { ...原创 2019-03-09 17:02:55 · 1369 阅读 · 0 评论 -
算法之移动k位
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4-&am原创 2019-03-07 13:16:14 · 331 阅读 · 0 评论 -
算法之跳到矩阵右下角位置的路径(不同路径)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总...原创 2019-03-07 15:26:04 · 943 阅读 · 0 评论 -
算法之最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。class Solution { public int minPathSum(int[][] grid...原创 2019-03-08 00:51:53 · 271 阅读 · 0 评论 -
算法之质数个数
统计所有小于非负整数 n 的质数的数量。示例:输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。思路什么是质数?就是这个数有除了1和自身外的约数,最小的质数是2可以先标2的所有倍数得到下一个质数 3(因为 3未被标记 – 意味这3不是某个数的倍数; 而且小于3的数中只有质数或已经被标记的数);然后标记所有3的倍数得到下一个质数为...原创 2019-06-07 02:57:12 · 1120 阅读 · 0 评论 -
算法之字符串同构
给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。示例 1:输入: s = “egg”, t = “add”输出: true示例 2:输入: s = “foo”, t = “bar”输出: false示...原创 2019-07-19 23:43:11 · 204 阅读 · 0 评论 -
算法之关于冒泡排序的奋斗史
//冒泡排序 -- 简单版本 void bubble(int[] array){ if(array==null){ return; } if(array.length<=1){ return; }// 冒泡排序的本质就是:(如...原创 2019-08-16 22:28:32 · 182 阅读 · 0 评论 -
算法之堆排序
要求:从小到大排序思路:先将数组构建成大顶堆, 然后依次“删除”顶部元素 到末尾 /** * “下沉”操作 ,如果构建大顶堆,将小的下沉;如果构建小顶堆,将大的下沉;这里是将小的下沉 * 由于从底部开始调整,,下面的已经是大顶堆了 * @param array 待调整的数组(堆) * @param parentIndex 父节点 * @p...原创 2019-09-04 15:43:03 · 195 阅读 · 0 评论 -
算法之计数排序
原理:用一个数组记录待排序数组中出现的数字。最低位代表最小值,偏移量是记录数组中的下标;待排序数组: 2 1 4 可以表示为记录数组: 1 1 0 1 数组长度为(4-1+1)然后根据记录数组输出结果 public static void countSort(int [] arr){ if(arr==null){ return; ...原创 2019-10-09 10:55:52 · 268 阅读 · 1 评论