![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
guoyuguang0
这个作者很懒,什么都没留下…
展开
-
全排列问题
1、打印一个无重复元素数组的全排列public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> ans = new ArrayList<>(); if (nums==null || nums.length==0) { return ans; } permute(an原创 2016-03-28 21:56:48 · 407 阅读 · 0 评论 -
一个无序整数数组中找到最长连续序列(Longest Consecutive Sequence)和两个元素使得相差最小
无序数组中查找最长连续序列: 1、最笨的方法,首先将无序数组排序,然后依次遍历查找最长连续序列。时间复杂度为O(nlgn),空间复杂度为O(1)。2、首先将元素存入HashSet,然后逐个遍历原数组。判断当前遍历的元素-1在不在set中,在就跳过,不在就以该元素为开始逐次+1,遍历是否在set中,记录最长的长度。时间复杂度为O(n),空间复杂度为O(n)。public class Solution原创 2016-03-24 11:04:20 · 5369 阅读 · 1 评论 -
查找两个有序数组的中位数和第K小的数
数组中查找中位数1、将两个数组合合并并排序,查找中位数,时间复杂度为O((n+m)lg(m+n)),空间复杂度O(m+n)。2、分别比较两个数组的中位数,如果midA < midB,说明要查找的两个数在数组A的右半部分和数组B的左半部份。如果midA>midB,说明要查找的两个数在数组A的左半部分和数组B的右半部份。每次比较丢掉一半,时间复杂度为O(lg(m+n)),空间复杂度为O(1)。publi原创 2016-03-24 15:42:16 · 468 阅读 · 0 评论 -
查找数组中重复出现的元素
题目:给定一个长度为n+1的int数组,其内元素为1到n,数组中除一个元素外其他元素都只出现一次,求重复出现的元素。要求时间小于O(n^2),空间为O(1)。1、要求时间复杂度小于O(n^2),那么肯定存在一种算法时间复杂度为O(nlgn),想到二分查找。public static int findDuplicate(int[] nums) { if (nums.length == 0 ||原创 2016-03-25 15:24:02 · 2872 阅读 · 1 评论 -
16年腾讯笔试模拟题
1、利用递归计算n位的格雷码greycode:二进制数据,相邻的两个元素只有一位不同public static List<String> getGreyCode(int n){ List<String> list=new ArrayList<String>(); if(n==0)return list; if(n==1){ li原创 2016-03-26 13:26:38 · 436 阅读 · 0 评论 -
合并多个有序链表
1、维持一个最小堆,利用堆的性质每次从堆中取出一个最小值加入node中。import java.util.ArrayList;import java.util.List;public class MergeKList { public static void main(String[] args) { // TODO Auto-generated method stub原创 2016-03-27 15:27:03 · 989 阅读 · 0 评论 -
在一个字符串中查找另外一个字符串的全排列出现位置
1、在一个字符串中查找另外一个字符串任意的全排列出现位置。例如:A=”abcfsfcba”,B=”abc”,则返回{0,6}。//the des's character must be adjacent public static List<Integer> getIndex(String res,String des){ List<Integer> list=new Arr原创 2016-03-28 13:07:04 · 1752 阅读 · 0 评论 -
查找有序旋转数组中的最小值
题目:给定一个有序数组,但是数组尾部的k个元素被移到了头部,查找该数组中的最小值。例如A={4,5,0,1,2},最小元素为0。1、假设数组中没有重复元素public int findMin(int[] nums) { if(nums.length==1)return nums[0]; int left=0,right=nums.length-1,mid;原创 2016-03-25 16:41:55 · 388 阅读 · 0 评论 -
数组中找到2,3,n个数等于一个值
1、给定一个数组,找到数组中两个元素等于一个值。1.1、先排序,两个指针,一个指头一个指尾,遍历一遍即可找到,时间复杂度为O(nlgn)(排序的时间),空间复杂度为O(1)。1.2、利用hashmap存放当前元素对应的元素,遍历一次就可找到,时间复杂度为O(n),空间复杂度为O(n)。public static int[] getTwoSum(int []val,int target){原创 2016-03-26 21:07:54 · 546 阅读 · 0 评论 -
图着色问题
1、有m种颜色,对n个节点进行着色,相邻节点颜色不能相同,可以有多少种着色方法?回溯package com.wangyi;import java.util.Arrays;public class GraphColor { public static void main(String[] args) { // TODO Auto-generated method stub原创 2016-04-02 20:51:59 · 914 阅读 · 0 评论 -
买卖股票收益最大问题
1、给定一个数组,代表每天股票的价格,买卖一次找到最大的收益。public int maxProfit(int[] prices) { if(prices==null||prices.length==0)return 0; int minVal=prices[0]; int maxProfit=0; for(int i=1;i<pric原创 2016-03-26 17:23:07 · 2006 阅读 · 1 评论 -
无序数组O(n)时间找到排序后的两个相邻元素使得他们之间的差最大
1、基数排序,然后根据排序后的数组找到相差的最大值。public int maximumGap(int[] nums) { if (nums == null || nums.length < 2) { return 0; } // m is the maximal number in nums int m = nums[0]; for (int原创 2016-04-01 16:10:04 · 557 阅读 · 0 评论 -
在一个只包含0,1的二维数组中找到最大矩形的面积
1、用一个height数组表示从从上到下连续的1的高度。left,right表示当前矩形的边界。maxA = max(maxA,(right[j]-left[j])*height[j]); 例如: 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0对第一行: l: 0 0 0 3 0 0 0 r: 7 7 7 4 7 7 7 对第二行: l: 0原创 2016-03-29 22:46:02 · 6760 阅读 · 2 评论 -
打印一个含有重复元素数组的所有子集
打印一个含有重复元素数组的所有子集。例如:[1,2,2]的所有子集为[[],[1],[1,2],[1,2,2],[2],[2,2]]。1、递归求解List<List<Integer>> list=new ArrayList<List<Integer>>(); public List<List<Integer>> subsetsWithDup(int[] nums) { Lis原创 2016-03-30 11:37:28 · 1279 阅读 · 0 评论 -
判断一个字符串是否是有其他两个字符串交错构成的(Interleaving String)
举个例子: s1 = “aabcc”, s2 = “dbbca”,如果 s3 = “aadbbcbcac”, return true. 如果 s3 = “aadbbbaccc”, return false.1、动态规划 public boolean isInterleave(String s1,String s2,String s3){ int s1len=s1.lengt原创 2016-03-30 17:56:16 · 1451 阅读 · 0 评论 -
二叉树的三种非递归遍历和morris遍历
1、先序遍历public static void printPreOrder(TreeNode node) { Queue<TreeNode> queue = new LinkedList<TreeNode>(); if (node == null) return; queue.offer(node); whil原创 2016-03-30 16:04:12 · 394 阅读 · 0 评论 -
恢复一棵二叉查找树
二叉搜索树中有两个节点的值被相互交换,还原一个正常的二叉搜索树。二叉搜索树,中序遍历,每次遍历的值都会比上次遍历的值小。根据中序遍历的这个性质可以找到值错误的节点,用first表示上一次遍历的节点,用second表示当前遍历的节点,但是我们不能确定到底哪一个才是错误的节点,继续遍历,如果接下来没有发现错误的节点,则交换上次发现的两个错误节点即可。如果接下来又发现了错误的节点,则说明现在遍历的节点和f原创 2016-03-30 21:27:03 · 972 阅读 · 0 评论 -
判断一棵树是否是二叉查找树
判断一棵树是否是二叉查找树 利用该节点对应的最大值和最小值来判断该节点是否符合二叉查找树的性质。public boolean isValidBST(TreeNode root) { return isValidBST(root, null, null);}public boolean isValidBST(TreeNode root,Integer min, Integer max) {原创 2016-03-30 18:55:32 · 3065 阅读 · 0 评论 -
将一棵二叉树按行输出
给定一个二叉树,按行从左到右输出一个树。例如按如下格式: 6 5 15 7 9 10 50 1、递归计算,感觉这种办法好傻public List<List<Integer>> levelOrder(TreeNode root) { if(root==null)return new ArrayList<List<Integer>>(); List<List<I原创 2016-03-31 11:47:30 · 597 阅读 · 0 评论 -
数组中除一个元素外其他所有元素出现二或三次,找到只出现一次的元素
1、数组中除一个元素外其他所有元素出现二,找到只出现一次的那个元素。public int singleNumber(int[] nums) { int res = nums[0]; for (int i = 1; i < nums.length; i++) res = res ^ nums[i]; return res;原创 2016-04-01 10:13:39 · 3919 阅读 · 0 评论 -
给定一个数组,判断从开始能否走到结束,最多需要几步?
给定一个非负数组,数组中的元素代表从当前位置可以向后跳几步,求出从数组开始到末尾最少可以跳几次。例如:A = [2,3,1,1,4],则最少需要2步,2–>3–>4。 1、最直观,递归 public int jump(int[] nums) { if(nums.length==1)return 0; return getLen(nums,0);原创 2016-03-24 18:52:33 · 3457 阅读 · 0 评论