acm
jliang981
这个作者很懒,什么都没留下…
展开
-
动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
1、先科普下最长公共子序列 & 最长公共子串的区别:找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。2、最长公共子串其实这是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"b转载 2016-04-24 20:08:21 · 1008 阅读 · 0 评论 -
[leetcode]Unique Paths II
>这道题目和上一题基本是一样的。只需要检测现在正在处理的那个单位是不是不可通过的,如果是就直接让这个单元格=0,也就是没有路径可以到右下角就好了。代码如下:public class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m=obstacleGrid.length原创 2015-12-09 19:37:32 · 594 阅读 · 0 评论 -
[leetcode]Unique Paths
题目意思统计从左上角到右下角的所有不同路径个数。思路一:直接使用递归 因为从第一步走到第二步,和从第二步走到第三步,问题的模型是一样,有一样的结构。思路二:动态规划,思路一的话,会超时,因为要计算很多重复的字路径。动态规划就是新建一个跟原来大小一样的二维数组,从右下角开始计算每一个方格到右下角的路径数。这样就可以重复利用子路径。 很经典的动态规划题目 使用从底到上的思路思路一代码:原创 2015-12-09 19:34:18 · 598 阅读 · 0 评论 -
UVA解题集
1 序系统的整理下第三章的学习笔记。例题代码是在未看书本方法前自己尝试并AC的代码,不一定比书上的标程好;习题除了3-8百度了求解方法,其它均独立完成后,会适当查阅网上资料进行整理总结。希望本博文方便自己日后复习的同时,也能给他人带来点有益的帮助(建议配合紫书——《算法竞赛入门经典(第2版)》阅读本博客)。有不足或错误之处,欢迎读者指出。 2 例题2.1 UVa272--Tex转载 2015-10-12 14:44:35 · 1130 阅读 · 0 评论 -
[leetcode] Maximum Subarray
思路:新建一个数组sum[i],sum[i]表示前i个数的最大的子数组和。比如样例数组[−2,1,−3,4,−1,2,1,−5,4]。对应的sum数组为[-2,1,-2,4,-3,5,6,1,5]. 知道sum[i-1]就可以求出sum[i] 当sum[i-1]小于等于0时,sum[i]就是nums[i],否则,就是sum[i-1]+nums[i];代码如下:public cla原创 2015-10-26 16:15:33 · 633 阅读 · 0 评论 -
UVA133
题目描述为了缩短领救济品的队伍,NNGLRP决定了以下策略:每天所有来申请救济品的人会被放在一个大圆圈,面朝里面。选定一个人为编号 1 号,其他的就从那个人开始逆时针开始编号直到 N。一个官员一开始逆时针数,数 k 个申请者,然后另一个官员第 N 个始顺时针方向数 m 个申请者,这两个人就被送去再教育。如果两个官员数的是同一个人,那个人则被送去从政,然后2个官员再在剩下的人里面继续选直到没转载 2015-10-26 15:06:02 · 607 阅读 · 0 评论 -
[leetcode]Palindrome Linked List
public class Solution { public boolean isPalindrome(ListNode head) { if(head==null||head.next==null) return true; int n=0; ListNode t=head; while(原创 2015-10-10 19:45:38 · 561 阅读 · 0 评论 -
写一个函数,计算0到n之间2的个数 (1-9的个数)
题目写一个函数,计算0到n之间2的个数。解答最简单直观的方法就是对于0到n之间的数,一个个地去统计2在它们上出现的个数, 然后累加起来即可。求2在某个数上出现的次数需要O(logn)的时间,一共有n个数, 所以共需要O(nlogn)的时间。代码如下:1234567891011121314151617int Count2(int n){ in转载 2015-10-21 10:05:00 · 2132 阅读 · 0 评论 -
[leetcode]Reorder List
public class Solution { public void reorderList(ListNode head) { if(head==null||head.next==null) return ; ListNode rhead,tmp,revhead=head,pre,cur=head,next;原创 2015-10-18 21:31:18 · 510 阅读 · 0 评论 -
[leetcode]Remove Duplicates from Sorted List
/*q一直指向p的前一个结点,p是要处理的结点。链表已经经过了排序*/public class Solution { public ListNode deleteDuplicates(ListNode head) { if(head==null||head.next==null) return head; List原创 2015-10-19 11:06:41 · 506 阅读 · 0 评论 -
[leetcode] Partition List
/*一个less指针指向比x小的,greater指针指向比x大的,最后再把这二个链表连起来。但是要先建立二个指针指向他们。保存链表头。*/public class Solution { public ListNode partition(ListNode head, int x) { if(head==null||head.next==null)原创 2015-10-18 20:10:44 · 499 阅读 · 0 评论 -
[leetcode] Swap Nodes in Pairs
/** 思路是 使用pre保存 上一个节点,cur保存当前正在处理的节点,next表示要交换的下一个节点,tmp保存这一组交换完成后,下一组要交换的开始节点。**/public class Solution { public ListNode swapPairs(ListNode head) { if(head==null||head.next==null原创 2015-10-17 10:41:10 · 530 阅读 · 0 评论 -
leetcode[242] Valid Anagram
题意:如果组成二个字符串的字符一样(不管顺序),那么字符串就是异构字符串。思路一:对字符串排序后,比较是否相等public class Solution { public boolean isAnagram(String s, String t) { char[] sc=s.toCharArray(); char[] tc=t.toCharAr原创 2015-09-05 15:42:01 · 762 阅读 · 0 评论 -
leetcode[257] Binary Tree Paths
public class Solution { List slist=new ArrayList(); public List binaryTreePaths(TreeNode root) { if(root==null) return slist; String rootval=String.valueOf(root.原创 2015-09-03 20:34:31 · 707 阅读 · 0 评论 -
[leetcode] Subsets
public class Solution { List> ret=new ArrayList>(); public List> subsets(int[] nums) { Arrays.sort(nums); List list=new ArrayList(); sub(list,nums,0,nums.length);原创 2015-11-03 09:47:52 · 712 阅读 · 0 评论 -
Leetcode:Subsets 求数组的所有子集
Given a set of distinct integers, S , return all possible subsets.Note: Elements in a subset must be in non-descending order.The solution set must not contain duplicate subsets.For exam转载 2015-11-03 10:22:54 · 4111 阅读 · 0 评论 -
[leetcode] Two Sum
使用一个hashMap把遍历过的数组元素存起来,然后再遍历下一个元素的时候,只需要判断目标数减去这个数是否存在就好了。比如nums=[3,2,4] target=6.遍历到3的时候,查找6-3是否出现在map里,不存在的话,把3写入map,遍历2的时候查找4是否存在,这时候4还没有放在map里,所以是不存在的。把2放在map里。遍历4的时候,2就存在了,结果就找到了。public c原创 2016-01-17 21:16:01 · 722 阅读 · 0 评论 -
[leetcode] Longest Substring Without Repeating Characters
思路:保持二个指针,i是慢指针,也就是最长字符串的开始位置,j表示当前查找的位置。indexOf函数,从i到j-1,搜索s[j]出现的位置,如果没有出现返回-1,如果出现了,返回匹配位置。当这个字符在前面出现的时候,j-i就是当前的最长子串的长度。然后i设置为匹配位置的下一个位置,从新开始查找。代码如下。public class Solution { public int length原创 2016-04-23 20:50:52 · 718 阅读 · 0 评论 -
[leetcode]Longest Increasing Subsequence
总体思想就是:For example, ifnums = [5,6,7,1,2,8,3,4,0,5,9]then after we prcoess the 7:S = [5,6,7]after w process the 2:S = [1,2,7]after we process the 8:S = [1,2,7,8]Then w原创 2016-05-03 20:14:51 · 749 阅读 · 0 评论 -
蘑菇街笔试--剪桌腿的最小代价
Arthur最近搬到了新的别墅,别墅特别大,原先的桌子显得比较小,所以他决定换一张新的桌子。他买了一张特别大的桌子,桌子是由很多条桌腿进行支撑的,可是回到家之后他发现桌子不稳,原来是桌子腿长度不太相同。他想要自己把桌子修理好,所以他决定移除掉一些桌腿来让桌子变得平稳。桌子腿总共有n条腿,第i条腿长度为li,Arthur移除第i桌腿要花费代价为di。假设k条腿桌子平稳的条件:超过一半桌腿能够达到桌腿原创 2016-04-19 11:08:19 · 1727 阅读 · 0 评论 -
[leetcode]Coin Change
1.只提供一种递归的思路,从上到下解决问题,没有完全优化,会超时。public class Solution { public int coinChange(int[] coins, int amount) { Arrays.sort(coins);//jdk降序排列 int len=coins.length; int total=0,p原创 2016-04-26 21:50:48 · 978 阅读 · 0 评论 -
最大公约数和最小公倍数
最大公约数利用,辗转相除法。网址:http://blog.sina.com.cn/s/blog_676370130101b66r.html求最小公倍数,有一条数学公式两个数相乘等于这两个数的最大公约数和最小公倍数的积 。利用最大公约数就可以求出最小公倍数import java.util.*; /*求最大公约数和最小公倍数*/ public class MaxCommonDiv原创 2016-04-10 16:37:54 · 1207 阅读 · 0 评论 -
[leetcode]Next Permutation
思路:从数组的后面往前遍历,当找到一个位置 i 的数字比他的前一个位置i-1数字大之后。再从 i 位置向后找,找到一个刚好比i-1位置的数字大的数字j,交换这二个数字,然后从i位置到数组末尾,把数组翻转一遍就好了。public class Solution { public void nextPermutation(int[] nums) { int len = num原创 2016-04-08 16:51:13 · 567 阅读 · 0 评论 -
[leetcode]Majority Element II
思路:可以使用三向切分的快速排序算法,因为这种算法会把小于某个数,等于某个数,和大于某个数的分开,分成三部分。很容易判断等于某个数的全部数量,对于这种重复值问题,很有效。public class Solution { List ret = new ArrayList(); public List majorityElement(int[] nums) { int原创 2016-04-09 10:20:45 · 661 阅读 · 0 评论 -
[leetcode]Remove Duplicates from Sorted Array II
public class Solution { public int removeDuplicates(int[] nums) { if(nums.length==0) return 0; int len=1,j=1,time=1,temp=nums[0]; for(int i=1;i<nums.length;i++)原创 2016-03-26 20:43:17 · 637 阅读 · 1 评论 -
LeetCode: Spiral Matrix 解题报告
转载网址:http://www.tuicool.com/articles/bA3yAfSpiral MatrixGiven a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.For example,Given the fo转载 2016-03-06 20:45:27 · 659 阅读 · 0 评论 -
[leetcode]Find Minimum in Rotated Sorted Array II
public class Solution { public int findMin(int[] nums) { int len=nums.length; int low=0,high=len-1; while(low if(nums[low] return nums[low]; }else if(nums[low]==nums[high]){ while(nums原创 2016-01-11 22:22:58 · 638 阅读 · 0 评论 -
[leetcode]Find Minimum in Rotated Sorted Array II
public class Solution { public int findMin(int[] nums) { int len=nums.length; int low=0,high=len-1; while(lownums[low+1]||low==high-1) return nums[low+1]; low++; } }else{ int mid=(low+high)/2; if(mid>原创 2016-01-11 22:21:30 · 584 阅读 · 0 评论 -
[leetcode]Best Time to Buy and Sell Stock I&II
public int maxProfit(int[] prices) { int len=prices.length; if(len==2) return prices[1]>prices[0]?prices[1]-prices[0]:0; int sum=0,tmp=0; int fast=0,slow=0;原创 2015-12-15 20:22:09 · 546 阅读 · 0 评论 -
堆的插入、删除和建立操作,堆排序
1. 堆堆:n个元素序列{k1,k2,...,ki,...,kn},当且仅当满足下列关系时称之为堆:(ki 或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4,...,n/2)若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)转载 2015-12-01 20:44:07 · 959 阅读 · 0 评论 -
[leetcode] Ugly Number II
public class Solution { public int nthUglyNumber(int n) { int[] ugly=new int[n+10]; for(int i=1;i ugly[i]=i; }//前六个数直接初始化 if(n return原创 2015-08-31 20:51:28 · 623 阅读 · 0 评论 -
[leetcode] Power of two
Given an integer, write a function to determine if it is a power of two.Hint:Could you solve it in O(1) time and using O(1) space? 这道题让我们判断一个数是否为2的次方数,而且要求时间和空间复杂度都为常数,那么对于这种玩数字的题,我们应该转载 2015-08-12 14:53:33 · 684 阅读 · 0 评论 -
leetcode 233: Number of Digit One
Number of Digit One Total Accepted: 307 Total Submissions: 1853Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.转载 2015-08-11 11:10:00 · 770 阅读 · 0 评论 -
[leetcode]Binary Tree Preorder Traversal
public class Solution { public List preorderTraversal(TreeNode root) { List ilist=new ArrayList(); Deque stack=new ArrayDeque(); TreeNode p=root; if(root原创 2015-05-04 10:52:07 · 404 阅读 · 0 评论 -
[leetcode] Min Stack
要设置一个辅助栈,保存每次存进去时,栈的最小值(新来的值,或者栈中的值)要注意判断当栈为空时,就可以直接把值压入栈,而不用通过比较。class MinStack { private Deque stack1 = new ArrayDeque(); private Deque stack2 = new ArrayDeque(); public void push原创 2015-05-12 17:08:03 · 576 阅读 · 0 评论 -
二叉树遍历 非递归算法
文库文章:http://wenku.baidu.com/link?url=9FJf0djV7G79YXSqRhQK3m52pm_EpCleUH3eaCZzm31F6VhroWcZI2nhxQn8ZQQ4ceItQBZfBB__iq1BLTJUgTvM0vA5oce55HGNfSh3CG7###二叉树前序遍历:根----左结点----右结点 所以在访问到一个节点不为空时:先访问转载 2015-05-04 09:44:02 · 562 阅读 · 0 评论 -
[leetcode]Binary Tree Inorder Traversal
public class Solution { public List inorderTraversal(TreeNode root) { List ilist=new ArrayList(); Deque stack=new ArrayDeque(); TreeNode tt=root; if(root==null原创 2015-05-04 11:01:43 · 400 阅读 · 0 评论 -
模4 最优路径问题
网址:http://www.bubuko.com/infodetail-7972.html如下图: 从1到4找出一条路径,要求路径的总长度mod4的余数最小。分析:一条从1到4的最优路径,在它走到2或3时mod4的余数不一定最小。也就是说,最优策略的子策略不一定最优,所以本问题不满足最优化原理,那么也就不能用动态规划来解决。但是我们可以把它转载 2015-05-11 15:26:54 · 1419 阅读 · 0 评论 -
二叉树的非递归后序遍历算法
转载网址:http://www.cnblogs.com/ybwang/archive/2011/10/04/lastOrderTraverse.html前序、中序、后序的非递归遍历中,要数后序最为麻烦,如果只在栈中保留指向结点的指针,那是不够的,必须有一些额外的信息存放在栈中。方法有很多,这里只举一种,先定义栈结点的数据结构typedef struct{Node * p; int rv转载 2015-04-30 19:39:52 · 1394 阅读 · 0 评论 -
采用路径模型实现遍历二叉树的方法
转载网址:http://www.cnblogs.com/hoodlum1980/archive/2013/05/08/3066108.html问题描述:对树的遍历有,前序遍历,后序遍历。(注意,这里前后序的定义是指节点本身和它的子结点之间的访问顺序关系,而不是某个节点的子结点之间的访问顺序关系,即这里的序指的是父子关系,而非子间关系)。对二叉树又有中序遍历(特别的,对二叉查找树的中序遍历,转载 2015-04-30 18:41:53 · 828 阅读 · 0 评论