算法
西电吴同学
这个作者很懒,什么都没留下…
展开
-
左右最值最大差
题目描述给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少? 给定整数数组A和数组的大小n,请返回题目所求的答案。分析首先可以确定的就是两个数中肯定有一个是A中的最大值。 假设是A[i],这时候我们有两种选择:左边和右边。原创 2016-09-19 22:47:58 · 370 阅读 · 0 评论 -
回文字符串问题
问题描述给定一个字符串,问是否能通过添加一个字母将其变为回文串。思路有两个思路。 如果加一个可以形成回文,那么减去一个也必定可以。可以通过遍历字符串减去一个字符判断是否回文,如果有存在那就输出YES,反之输出NO。 如果字符串首位不一样,那么加上的字符要么是在末尾加上第一个字符,要么是在头部加上末位的字符,判断两种情况是否存在回文串就可以;如果首尾一样,那么就可以略去首尾,继续用这种方法判断。原创 2016-11-09 00:03:23 · 477 阅读 · 0 评论 -
快速求二进制中1个数
先放代码 public static int countNum(int n) { int count = 0; while (n != 0) { n &= (n - 1); count++; } return count; }n & (n - 1)能够置位最右边的1为0,这样原创 2016-09-19 22:23:47 · 1450 阅读 · 0 评论 -
使用位运算实现加法
分析求两个整数之和,要求不使用+、-、*、/四则运算符号,那么只能想到用位运算了,其实二进制和十进制的运算是很相似的,都是每一位相加,多出来的进位。以7和3为例,二进制分别是111和101,假设不考虑进位,那么结果就是010,也就是111^101,同时也可以算得进位就是(111&101)<<1,最后就变成了这两个数相加,重复之前的步骤,直到进位是0,就完成了加法。实现 public stati原创 2017-03-31 00:06:38 · 2386 阅读 · 0 评论 -
消失的数字
题目描述给定一个数组a[],长度为n,保证1<=a[i]<=n,找出1-n中所有未出现的数字,不使用额外空间且时间复杂度为O(n).思路分析如果可以使用额外空间,我们会使用一块额外空间来记录某一个数字是否出现过,遍历一遍a来更新额外空间状态,然后遍历额外空间来获得未出现的数字。现在不允许使用额外空间,我们可以不可以直接在数组上来保存状态?可以这样做,假设数组长度为n,我们发现a[0]=3,那么说明3原创 2017-04-04 23:16:56 · 1595 阅读 · 0 评论 -
求二叉树满足条件路径
问题给定二叉树,求的某一路径满足所有节点和为某一个值分析采用递归,定义一个方法List getPath(Node root, int target),从root开始,首先判断root.val是否大于target,如果大于说明这个路径不可能成功,返回一个空的List就可以,如果小,那么target -= val,然后递归左右节点,如果返回的List不空,那么说明满足,就可以add自己进path了。其实原创 2017-08-25 22:26:08 · 472 阅读 · 0 评论