
剑指offer
Enpong
我是小小白
展开
-
剑指offer---最小的K个数
解法一:最小堆复杂度:O(NlogK) + O(K)特别适合处理海量数据应该使用大顶堆来维护最小堆,而不能直接创建一个小顶堆并设置一个大小,企图让小顶堆中的元素都是最小元素。维护一个大小为 K 的最小堆过程如下:在添加一个元素之后,如果大顶堆的堆顶大小大于该元素,那么需要将大顶堆的堆顶元素与该元素交换,重新调整最大堆。public ArrayList<Integer> G...原创 2019-02-27 15:23:00 · 156 阅读 · 0 评论 -
剑指offer---字符串的排列
基于回溯法思想(排列树):第一次交换:字符串首字母与其他位置字母分别交换,形成多个子树;再第一次交换基础上,发生第二次交换,第二次交换是字符串第二个字母与其他位置字母交换;…直到最后一个字母结束;public ArrayList<String> Permutation(String str) { List<String> res = new Arr...原创 2019-02-27 09:37:53 · 224 阅读 · 0 评论 -
剑指offer---二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。递归法,中序遍历: private TreeNode pre = null; private TreeNode head = null; public TreeNode Convert(TreeNode pRootOfTree) { in...原创 2019-02-27 01:00:22 · 123 阅读 · 0 评论 -
剑指offer---复制链表的复制
第一步,在每个节点的后面插入复制的节点。第二步,对复制节点的 random 链接进行赋值。第三步,拆分public RandomListNode Clone(RandomListNode pHead) { if(pHead == null){ return null; } //插入复制节点 ...转载 2019-02-27 01:00:35 · 155 阅读 · 0 评论 -
剑指offer---反转链表
递归:public ListNode FindKthToTail(ListNode head,int k) { if(head==null) return null; ListNode p1 = head; while(p1!=null &amp;&amp; k--&gt;0){ p1 = p1.ne...原创 2019-02-27 01:00:42 · 108 阅读 · 0 评论 -
剑指offer---链表中倒数第k个节点
解题思路:设链表的长度为 N。设两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到 N - K 个节点处,该位置就是倒数第 K 个节点。public ListNode FindKthToTail(ListNode head,int k) { if(head...原创 2019-02-27 01:00:49 · 102 阅读 · 0 评论 -
剑指offer---数值的整数次方
高效解法:下面的讨论中 x 代表 base,n 代表 exponent。因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。比如:我们的目标是求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要16次放的基础上再平方一次就可以了。而16次方又是8次方的平方。这样以此类推,我们求32次方只需要5次乘方:先求平方,在平...原创 2019-02-27 01:00:58 · 145 阅读 · 0 评论 -
剑指offer---二进制中的个数
题目描述输入一个整数,输出该数二进制表示中 1 的个数。n&amp;(n-1)该位运算去除 n 的位级表示中最低的那一位。n : 10110100n-1 : 10110011n&amp;(n-1) : 10110000时间复杂度:O(M),其中 M 表示 1 的个数。public int NumberOf1(int n) { int count ...原创 2019-02-27 01:01:06 · 218 阅读 · 0 评论 -
剑指offer---删除链表中重复的结点
原创 2019-03-02 14:10:38 · 105 阅读 · 0 评论 -
剑指offer---数组中只出现一次地数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字解题思路两个相同的数异或的结果为0;利用这点将数组的所有元素异或得到的结果即是不存在重复的两个元素异或的结果;diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来假设两个元...原创 2019-02-28 10:33:29 · 113 阅读 · 0 评论 -
剑指offer---求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解法使用递归解法最重要的是指定返回条件,但是本题无法直接使用 if 语句来指定返回条件。条件与 && 具有短路原则,即在第一个条件语句为 false 的情况下不会去执行第二个条件语句。利用这一特性,将递归的返回条件取非然后作为 &...转载 2019-02-28 00:35:20 · 237 阅读 · 0 评论 -
剑指offer---第一个只出现一次的字符
使用 HashMap 对出现次数进行统计public int FirstNotRepeatingChar(String str) { if(str==null || str.length()==0) return -1; Map<Character, Integer> map = new HashMap<>();...原创 2019-02-27 17:10:43 · 109 阅读 · 0 评论 -
剑指offer---丑数
来源牛客网:https://www.nowcoder.com/profile/835689/codeBookDetail?submissionId=1522621通俗易懂的解释:首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到...转载 2019-02-27 16:29:36 · 99 阅读 · 0 评论 -
剑指offer---整数中1出现的次数
来源:牛客网https://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6主要思路:设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),分别对每个数位上有多少包含1的点进行分析根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i当i表示百位,且百位对应的数&...转载 2019-02-27 15:28:57 · 125 阅读 · 0 评论 -
剑指offer---数组中出现次数超过一半的数字
一般解法 :1.先对数组进行排序,然后取数组中间位置元素,再对数据扫描一趟来判断此元素是否为多数元素。时间复杂度O(nlog(n)),空间复杂度O(1)。2.使用一个hash表,对数组进行一趟扫描统计每个元素出现的次数,即可得到多数元素。时间复杂度O(n),空间复杂度O(n)多数投票问题解法:可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题...原创 2019-02-27 10:31:02 · 180 阅读 · 0 评论