算法与数据结构
lixq05
这个作者很懒,什么都没留下…
展开
-
每日一题--最小的k个数
两种解法: 一种基于Partition(将要改变输入数组),时间复杂度O(n) 另一种使用最大堆的方法(可以解决海量数据),时间复杂度O(nlogk)重点:最大堆的建立方法//Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆//建最大堆import java.util.Arrays;/** * 问题描述:输入n个整数,输出其最小的k个数 * 输入:4,5,1原创 2017-09-03 14:59:17 · 182 阅读 · 0 评论 -
圆圈中最后剩下的数字
题目描述:0,1,,,,,n-1这n 个数字排成一个圆圈,从数字0开始每次从这个圆圈中删除第m个数字。求出这个圆圈里剩下的最后一个数字.经典解法:用环形链表模拟圆圈public void lastRemaining(int totalNum,int index){ List<Integer> list = new ArrayList<Integer>(); for(int原创 2017-09-20 19:14:17 · 210 阅读 · 0 评论 -
每日一题--数字在排序数组中出现的次数
一下子想到的解法是遍历,时间复杂度为O(n) 改进:排序的数组,想到二分查找查找数字的方法,这里迁移为找第一次出现该数字和最后一次出现该数字,最后得到数组中该数字出现的总次数。 如何在数组中找到第一个数字出现的位置???? 二分查找总是先拿中间的值与k作比较,如果中间数字大于k,则第一个出现的肯定在数组的前半段,如果中间数字小于k,则第一个出现的肯定在数组的前半段,较为复杂的是:中间数字等于k原创 2017-09-12 13:05:34 · 192 阅读 · 0 评论 -
每日一题
题目思路:在遍历数组时保存两个值,一个是数组中的数字,一个是次数。当遍历到下一个数字时,如果和我们当前保存的数字相同的话,次数加一,否则减一,如果次数为0的话,我们保存下一个数字,并将次数设为1;最后我们要找的数字一定是最后一次把此时设为1的相应的数字易遗漏地方要检验数组是否有效:即是否数组中还有符合题意的数字代码:时间复杂度o(n)/** * 问题:数组中有一个数字出现次数超过数组长度的一半,找原创 2017-09-02 10:04:43 · 262 阅读 · 0 评论 -
每日一题--两个链表的第一个公共结点
最糟糕的也是最容易想到的解法:对两个链表进行遍历,时间复杂度为O(mn) 改进解法:对于单链表而言,从第一个公共结点开始,之后所有的结点都是重合的,不可能出现分叉从两个链表的尾部进行遍历,最后一个相同的结点就是我们要找的结点。 但是单链表只能从前往后遍历,所以这里又用到了一个数据结构–栈 这里我们需要用到两个辅助栈,空间复杂度为O(m+n),时间复杂度为O(m+n); 第三种思路:我们首先得原创 2017-09-11 12:24:27 · 228 阅读 · 0 评论 -
每日一题--数组中的逆序对
解题思路:拿数组中的每个数组元素跟它后面的比较,时间复杂度为O(n^2) 实际统计逆序对的过程:先把数组分割成子数组,先统计出子数组内部的逆序对数目,然后再统计出两个相邻子数组之间的逆序对数目,在统计的过程中还要进行排序(以免进行重复计算),这个排序过程实际上是归并排序(分治策略)。时间复杂度是O(nlogn)。 代码:/**问题描述:在数组中两个数字如果前面的一个数字比后面的一个数字大则为一个原创 2017-09-10 08:58:17 · 267 阅读 · 0 评论 -
每日一题--n个骰子的点数
基于循环求骰子总数:用两个数组来存储骰子点数出现的每一个总和出现的次数: 第一个数组中的第n个数字代表骰子点数和为n出现的次数 第二个数组的第n个数字设为前一个数组对应的第n-1,第n-2,第n-3,n-4,n-5,n-6之和 解释:一次循环中第一个数组中的第n个数字代表骰子点数和为n出现的次数 下一次循环,我们加上一个新的骰子,此时和为n的骰子出现的次数应该为上一次循环中骰子点数和为n-1原创 2017-09-17 18:51:20 · 285 阅读 · 0 评论 -
每日一题--翻转单词顺序||左旋转字符串
解题思路: 翻转单词顺序:先将整个字符串翻转,再翻转各个单词 eg: I am a student. ——–> .tenduts a ma I —-> students. a am I 左旋转字符串:分成两部分:两部分分别旋转,再整体旋转得到结果 eg: abcdefg —–> bagfedc ———> cdefgab 代码:/**问题描述:翻转单词顺序 * 输入:I am a stud原创 2017-09-16 15:34:21 · 251 阅读 · 0 评论 -
每日一题--第一个只出现一次的数字
哈希表的理解和运用哈希表的几个重要方法: 1public synchronized Object get(Object key) 根据给定关键字key获取相对应的对象。 2.public synchronized boolean containsKey(Object key) 判断哈希表中是否包含关键字key。 3.public synchronized boolean conta原创 2017-09-08 13:02:46 · 296 阅读 · 0 评论 -
每日一题--和为s的两个数||和为s的连续整数列
和为s的两个数:时间复杂度o(n)package core;/** 和为s的两个数字,输入数组为递增的 * Created by lxq on 2017/9/15. */public class Problem5 { public static void main(String[] args){ Problem5 problem5 = new Problem5();原创 2017-09-15 13:30:27 · 235 阅读 · 0 评论 -
每日一题--丑数
用空间换时间一、逐个判断是否是丑数,直观但不高效 二、根据丑数的定义,丑数应该是另一个丑数乘以2,乘以3或者乘以5(1除外)解决方案: 创建一个数组,里面的数组都是排好序的,每一个丑数都是前面的丑数乘以2,乘以3或者乘以5得到的重点:怎样确保数组中的丑数都是排好序的???? 首先:把已有的丑数乘以2(其中最小值为M2)得到的大于已有数组中最大的丑数,乘以3(其中最小值为M3)得到的大于已有数组原创 2017-09-07 13:38:57 · 235 阅读 · 0 评论 -
每日一题--数组中只出现一次的数字
知识点:任意一个数字跟他本身异或得到的都是0; 对于一个数组中如果只有一个数字只出现一次,那么这个数组最后异或得到的结果就是它;问题中有两个只出现一次的数字: 解决过程:数组异或得到的结果为两个只出现一次的数字异或得到找到这个结果第一个出现1的位置按照得到的位置上是否为1将数组分成两个:含有若干对数字和一个只出现一次的数字最后对两个数组中的数字异或,得到的就是两个只出现一次的如何得到数字原创 2017-09-14 09:00:11 · 265 阅读 · 0 评论 -
每日一题--把数组排成最小的数
题目分析:找到一个排序规则,将数组排序。这个规则比较两个数m和n哪个排在前面值会比较小(用字符串大小比较来比较 mn>nm) 重要推导:根据这种比较规则把数组排序后,将数组中所有数字拼接起来得到的数字是最小的(反证法) 代码: * 问题描述:输入一个正整数数组,将数组中所有数字拼接起来排成一个数,打印拼接出的所有数中最小的一个 * 输入:{3,32,321} * 输出:321323 *原创 2017-09-06 13:04:34 · 198 阅读 · 0 评论 -
每日一题--二叉树的深度
前面有一道题:用栈来保存二叉树的遍历 从另一个角度来分析树的深度:如果一个树只有一个结点,则深度为1如果根节点只有左子树或者右子树,树的深度等于 (左子树的深度||右子树的深度)+1如果都有,则取左子树和右子树中深度大的那一个,然后再加上1用递归实现很容易代码: public int treeDepth(BinaryTreeNode root){ if(root==null原创 2017-09-13 19:16:00 · 243 阅读 · 0 评论 -
每日一题--从1到n整数中1出现的次数
从数字规律来分析一位数的情况: 1.大于等于1的时候,有1个; 2.小于1的时候,有0个。 两位数的情况: 》》个位数的情况: 1.如果个位数大于等于1,则个位数出现1的次数==十位数上的数字+1; 2.如果个位数等于0,则个位数出现1的次数==十位数上的数字 》》十位数的情况: 1.如果十位数上的数字等于1,则十位数出现1的次数==个位数上数字+1; 2.如果十位数上的数字大于1原创 2017-09-05 13:30:40 · 395 阅读 · 0 评论 -
每日一题--连续子数组的最大值
思想:动态规划用递归的方式分析动态规划问题,但编码时常常使用循环来解决解题思路 设置两个变量:一个保存最大值,一个保存当前遍历到i的最大值(用动态规划,公式见下方) 代码:/**动态规划 * 问题:输入一个整型数组,有正数也有负数。数组中连续几个数字为一个子数组,求所有子数组的最大值 * 输入:{1,-2,3,10,-4,7,2,-5},最大的子数组为{3,10,-4,7,3,-5} *原创 2017-09-04 13:10:50 · 266 阅读 · 0 评论 -
动态规划--最长公共子序列
http://blog.csdn.net/rrrfff/article/details/7523437转载 2017-10-20 09:36:49 · 238 阅读 · 0 评论