Algorithm
豆芽炒粉丝
世上万事,不过一拖二闹三不读书。
展开
-
动态规划(Dynamic Programming)学习笔记记录
要了解DP,需要知道递归的知识和基本的暴力搜索。定义:本质:递归原问题(N)->子问题(N-1)->原问题(N)最优子结构子问题最优决策可导出原问题最优决策 无后效性重叠子问题去冗余 空间换时间(注意分析时空复杂度)基本步骤: 四个步骤设计暴力算法,找到冗余 设计并存储状态(一维,二维,三维数组,甚至用Map) 递归式(状态转移方程) 自底向上计算最优解(编程方原创 2016-09-14 19:23:13 · 1748 阅读 · 0 评论 -
LeetCode216:Combination Sum III
从1-9中取k个数和为n,且数不重复。首先可能想到的是用一个boolean数组记录用过的数字,Boolean数组的下标+1即为数字。但这题我们发现,选取的数组是递增的,所以无需使用一个数组记录使用过的数字,我们取一个数然后往后枚举即可,当满足条件时,将当前的答案记录到集合中即可。public class Solution { public List<List<Integer>> ans = n原创 2016-12-03 10:43:23 · 310 阅读 · 0 评论 -
LeetCode 39:Combination Sum
每一次向下搜索时,起始位置都和上一次相同,因为可以取相同元素不止一次,即每次向下传入的index For循环每次从index开始,避免返回到之前的元素 DFS搜索 如果sum>target 则return 如果sum == target 则记录下来 否则 继续DFS搜索public class Solution { public List<List<Integer>> ans =原创 2016-12-01 20:29:14 · 391 阅读 · 0 评论 -
LeetCode 46: Permutations
即求n个不重复的数的组合。 思路: 先固定第一位,枚举第二位,。。。第n位,注意需要记录已经用过的数字。用代码说话:public class Solution { public List<List<Integer>> ans = new ArrayList<>(); public boolean[] used = new boolean[100]; //記錄用過的數組 p原创 2016-11-29 20:28:38 · 353 阅读 · 0 评论 -
LeetCode 300: Longest Increasing Subsequence
最长增加的子序列问题,归于动态规划问题。分析:从最后面的数往前去找。假设串为[10,9,2,5,3,7,101,18],我们从最后一个数18开始找,那么18这个数我们到底需不需要第一步就将它加入到最长子串呢?如果先加入进去的话,我们默认从18开始,那么18就为一个上限了,也就是说,我把这个递增的子串的上限给确定下来了(为18),这样一来是不是很不方便呢? 于是,我们可以在原始数组的后面添加一个非常原创 2016-11-27 16:29:05 · 326 阅读 · 0 评论 -
LeetCode-Number of 1 Bits
Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight). For example, the 32-bit integer ’11’ has binary representation 00000000000原创 2016-10-13 09:02:42 · 318 阅读 · 0 评论 -
Leetcode 326 : Power of Three
Given an integer, write a function to determine if it is a power of three.确定这个数是不是3的幂对于确定一个数n是不是k幂而言,有如下方法:只需求得在int允许的最大范围的k为底的最大的数p,如果这个最大的p能被n整除,那么就为k幂例如:确定一个数n是不是3的幂,在整型范围内可以先求3为底的最大的数,记为p,如果p%n==0,原创 2016-10-13 08:49:06 · 339 阅读 · 0 评论 -
LeetCode 371:Sum of Two Integers
LeetCode 371:Sum of Two IntegersCalculate the sum of two integers a and b, but you are not allowed to use the operator + and -加法(a + b)用^、&和<<即可实现,a^b可得到对应位没有进位时的和,a&b可得到各位产生的进位值。如:a=010010, b=100111,计原创 2016-10-07 10:30:52 · 363 阅读 · 0 评论 -
LeetCode 144: Binary Tree Preorder Traversal
Q: Given a binary tree, return the preorder traversal of its nodes’ values.前序遍历: 根左右/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tr原创 2016-10-03 10:58:13 · 360 阅读 · 0 评论 -
Leetcode 14 : Longest Common Prefix
Q:Write a function to find the longest common prefix string amongst an array of strings.分析: 一个字符数组的最长公共前序。例如”abcdsa”,”a”,”abcjd”的公共前序就是”a”,不难见得,最长公共前序是由最短的字符串来决定的,那么可以如下的一种思路: 1.求得前两个字符串的公共前序,存为ans原创 2016-09-29 08:10:45 · 355 阅读 · 0 评论 -
LeetCode 9 : Palindrome Number
Determine whether an integer is a palindrome. Do this without extra space.判断是否为回文数字,12321,1001即为回文,反过来与正着念都是一样代码:public class Solution { public boolean isPalindrome(int x) { //bound边界条原创 2016-09-24 14:06:15 · 331 阅读 · 0 评论 -
LeetCode 3:Longest Substring Without Repeating Characters
Question: 双指针,移动窗口问题。维护一个[st,etd)的窗口,不断向右进行滑动,当[st,etd)不包含etd位置上的字符时,将etd位置上的字符加入[st,etd)->[st,etd] 如果[st,etd)包含etd,则st向右滑动,直到找到与etd位置相同的字符[st,etd)->[st+1,etd)简单使用图形演示一下 “abcabcbb”时候的情况 java代码:p原创 2016-09-22 10:17:45 · 340 阅读 · 0 评论 -
LeetCode 167:Two Sum II - Input array is sorted
排好序(升序)的一列数numbers,给定一个数key,求数列中是否存在两个数的和为给定的数key,若有则返回下标(从1开始,并不是0) 双指针问题,一个指向前部st,一个指向尾部etd。 那么分三种情况,如果numbers[st]+numbers[etd]>target ,那么说明需要值大,需要减小,只有etd往左移动才是减小(etd往右是增大,st往右也是增大),所以etd–number原创 2016-09-19 07:28:37 · 439 阅读 · 0 评论 -
LeetCode 72 Edit Distance DP解法思路记录
leetcode 72 Edit Distance 给定两个字符串,寻找最小的操作数,使得word1变为word2. 1.可以插入字符 2.可以删除字符 3.可以替换字符 对于上面的讲解如下: 1.对应位置相同则不去扣分即不进行任何操作,不同则扣一分(需要修改) 2.两个特殊字符”-“不会对应的意思是,可以反过来理解,如果两个特殊字符对应,那么特殊字符的位置不可能是在字符之间,原创 2016-09-17 21:39:36 · 763 阅读 · 0 评论 -
LeetCode473: Matchsticks to Square
public class Solution { //sums是当前每个边的大小 index是在数组中的位置 average是每个边的长度 public boolean robot(int[] nums, int [] sums , int index, int average){ //边界条件 if(nums.length3 || index>num原创 2016-12-24 10:17:58 · 1157 阅读 · 3 评论 -
LeetCode105: Construct Binary Tree from Preorder and Inorder Traversal
与题目106类似: 从前序遍历,与中序遍历中还原二叉树。 假设树: 通过先序遍历找到第一个点作为根节点,在中序遍历中找到根节点并记录index。 因为中序遍历中根节点左边为左子树,所以可以记录左子树的长度(index-in_left),并在先序遍历中依据这个长度找到左子树的区间,用同样方法可以找到右子树的区间。 递归的建立好左子树和右子树即可。 public c原创 2016-12-18 20:58:23 · 531 阅读 · 0 评论 -
LeetCode121:Best Time to Buy and Sell Stock I and II
public class Solution { public int maxProfit(int[] prices) { if(prices==null || prices.length==1){ return 0; } int ans = Integer.MAX_VALUE; for(int i=0;原创 2016-12-31 14:09:34 · 356 阅读 · 0 评论 -
LeetCode40:Combination Sum II
从集合中取n个数和为target,数字可能有重复,每个数字只能选一次,这道题目需要注意candidates[] 数组中的元素是会有重复的,所以答案里面会出现重复的解,需要在求解过程中对相同的数字不再进行深度搜索即可。 public class Solution { public List<List<Integer>> ans = new ArrayList<>(); public L原创 2016-12-04 18:16:29 · 289 阅读 · 0 评论 -
LeetCode113:Path Sum II
将当前节点加入到临时存储集中,若满足条件则加入到结果集,否则向下搜索左右子树,在搜索完左右子树后还原(回溯法)1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就原创 2016-12-06 09:42:13 · 361 阅读 · 0 评论 -
LeetCode 22 :Generate Parentheses
作为经典的回溯问题,这道题对于理解回溯的基本框架帮助还是挺大的。所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集所以在思考问题的时候,首先需要考虑: 1. 边界条件(任何算法都需要考虑这个,往往输入并不如你所想那么理想) 2. 满足解的条件原创 2016-12-07 21:27:53 · 322 阅读 · 0 评论 -
抽屉原理( 鸽巢原理、重叠原理、狄利克雷)笔记记录
桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。” 抽屉原理有时也被称为鸽巢原理。它是组合数学中一个重要的原理。第一抽屉原理:原理1: 把多于n个(n+k)原创 2016-09-07 15:49:15 · 11954 阅读 · 0 评论 -
判断二叉搜索树的后序遍历序列是否合法
简单的分析一下,后序遍历,遍历顺序为左右根,那么序列的最后一个节点必为根节点。由于二叉搜索树的性质,根节点的左子树所有值小于根节点的值,右子树大于根节点,那么,我们只需要将序列分为左子树(leftTree)和右子树(rightTree),然后将左子树(leftTree)再分为左子树(left_leftTree)和右子树(left_rightTree),右子树(rightTree)分为左子树(left原创 2016-09-25 11:11:37 · 1233 阅读 · 0 评论 -
中缀表达式改后缀表达式
我们把平时所用的标准四则运算表达式,即“9+(3-1)*3+10/2”叫做中缀表达式。因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化。规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止中原创 2016-10-11 11:23:42 · 590 阅读 · 0 评论 -
二叉树的镜像
如下有原来的二叉树(左图所示),镜像二叉树(右图所示),通过对比,发现,就是将左右孩子换了个位置而已,其余并没有改变。 思想: 如果当前节点有孩子,则交换位置。否则,返回镜像过程: /** * 一棵树得到它的镜像树 前提是有孩子 * @author BayMax * */class TreeNode{ TreeNode left; TreeNode right;原创 2016-09-26 07:35:54 · 322 阅读 · 0 评论 -
二叉树层次遍历
将图示的二叉树按照层次遍历,即得到遍历顺序为 8,6,10,5,7,9,11思想: 打印节点,如果该节点为空,则返回。 否则打印该节点,如果该节点存在孩子节点则存入队列,直到无孩子节点代码: 节点结构:class TreeNode{ TreeNode left; TreeNode right; int value; public TreeNode(int原创 2016-09-26 09:57:04 · 704 阅读 · 0 评论 -
从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。由尾到头打印,那么考虑到是逆序打印,可以往栈或递归方面想。 在不能改变链表结构的时候,我们需要考虑用栈。 找到尾节点,最起码我们需要遍历一次链表,那么先遍历到的节点却是在后面打印,这满足一个“先进后出”或者“后进先出”的性质,这就是栈了。所以考虑用栈来做这道题目即可Link结构:public class Link { int原创 2016-09-27 09:16:04 · 312 阅读 · 0 评论 -
旋转数组的最小数字
题目: 把一个数组最旋转数组的特点:(1)递增排序的数组旋转之后的数组可划分为两个排序的子数组;(2)前面的子数组的元素都大于或等于后面子数组的元素;(3)最小的元素刚好是两个子数组的分界线;(4)旋转数组在一定程度上是有序的;在有序的数组中可以用二分查找实现O(logn)的查找,我们也可用二分查找的思想寻找旋转数组的最小数字。思路: 1. 设置两个指针,初始状态第一个指针指向前面子数组的第一个元原创 2016-09-27 16:24:07 · 303 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。最直接的想法是:从头到尾扫描这个数组,如果遇到偶数时,将这个偶数取出,将后面的每个数字往前挪一位,最后将取出的偶数放置在最后的位置上。每次取出一个偶数,后面的数都需要移动,所以时间复杂度O(n2)O(n^2)考虑双指针解法: 一个指向数组的首部(st),另一个指向数组的尾部(e原创 2016-09-29 08:59:43 · 581 阅读 · 0 评论 -
包含min函数的栈
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都为O(1)思路: 首先想到的是,在将元素压入栈的时候,将所有元素进行排序,比如压入元素的顺序为 {21,3,5,7,1},第一个压入21,第二个压入3的时候需要将21先取出,然后再压入3,再压入21,以此类推,但是这样并不符合时间复杂度为O(1)。于是想到,使用一个成原创 2016-10-06 19:21:08 · 284 阅读 · 0 评论 -
LeetCode 20:Valid Parentheses
符号匹配问题,使用栈解决即可。 当为’(‘,’[‘,’{‘时,入栈即可,当遇到’)’,’]’,’}’时,当栈不为空则进行出栈操作,判断是否匹配。例如遇到’)’时,栈不为空且出栈的字符为’(‘即表示匹配,否则返回false检查字符是用==,检查String是用.equals(),因为String是引用类型,值相等但是地址可能不等。public class Solution { public原创 2016-12-08 21:28:51 · 239 阅读 · 0 评论 -
LeetCode106:Construct Binary Tree from Inorder and Postorder Traversal
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution {原创 2016-12-11 19:36:32 · 293 阅读 · 0 评论 -
LeetCode104:Maximum Depth of Binary Tree
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution {原创 2016-12-11 11:17:38 · 288 阅读 · 0 评论 -
LeetCode110:Balanced Binary Tree
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution {原创 2016-12-11 11:15:53 · 316 阅读 · 0 评论 -
LeetCode257:Binary Tree Paths
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution {原创 2016-12-11 11:13:37 · 301 阅读 · 0 评论 -
LeetCode 357: Count Numbers with Unique Digits
public class Solution { public int countNumbersWithUniqueDigits(int n) { if(n==0) return 1; if(n==1) return 10; int ans =10; int base = 9; //int result=0;原创 2016-12-11 11:08:32 · 282 阅读 · 0 评论 -
LeetCode111:Minimum Depth of Binary Tree
DFS系列思路: 1.边界条件:如果树为空,则返回 2.满足条件的解:当到达叶子节点时,即左右子树为空,则比较当前的深度与所记录的最小深度,若比最小深度小,则更新最小深度,否则不执行。 3.如果左子树不为空则进行搜索,如果右子树不为空则进行搜索。public class Solution { public int minDepth=Integer.MAX_VALUE; publ原创 2016-12-09 16:29:51 · 290 阅读 · 0 评论 -
LeetCode376:Wiggle Subsequence
这道题的意思是寻找一个子序列,这个序列需要满足一定的条件: 1. 不能连续递增或者递减 2. 只能间隔递增或者递减 3. 两数之间的差值必须不为0对于满足要求的序列[1,7,4,9,2,5],我们可以做一个图: 我们发现这个图形的规律,是不是一上一下或者一下一上,形成一个拐点就是答案呢?再来看看几种不符合情况的图:第一种情况: 只需要将标记红色的去除,即可得到wiggle su原创 2016-12-21 08:50:28 · 528 阅读 · 0 评论