剑指offer
长弓Smile
这个作者很懒,什么都没留下…
展开
-
扔鸡蛋问题
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X &l...原创 2018-09-25 21:36:07 · 653 阅读 · 0 评论 -
LeetCode 82. 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例 2:输入: 1->1->1->2->3 输出: 2->3/** * Definition for singly-linked...原创 2018-06-26 20:45:55 · 115 阅读 · 0 评论 -
丑数
丑数就是只包含质因数 2, 3, 5 的正整数。 1.判断丑数 2.找到第n个丑数 (代码很容易看懂)public class UglyNum { public static void main(String[] args){ UglyNum a = new UglyNum(); Scanner scanner = new Scanner(Syst...原创 2018-06-19 21:54:05 · 99 阅读 · 0 评论 -
LeetCode160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。例如,下面的两个链表: 在节点 c1 开始相交。注意:如果两个链表没有交点,返回 null. 在返回结果后,两个链表仍须保持原有的结构。 可假定整个链表结构中没有循环。 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。解题思路: 1.找到两个链表长度差n后较长的链表先走n步 2,然后两个指针同时向前走,如果两个...原创 2018-06-26 14:57:22 · 1598 阅读 · 1 评论 -
Leetcode21. 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4解题思路: 递归class Solution { public ListNode mergeTwoLists(ListNode l1, Lis...原创 2018-06-25 17:21:02 · 699 阅读 · 0 评论 -
LeetCode447. 回旋镖的数量
给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。示例:输入: [[0,0],[1,0],[2,0]]输出: 2解释: 两个回旋镖为 [[1,0],[...原创 2018-06-25 17:00:12 · 408 阅读 · 0 评论 -
LeetCode347:前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。例如,给定数组 [1,1,1,2,2,3] , 和 k = 2,返回 [1,2]。注意:你可以假设给定的 k 总是合理的,1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。解题思路: 采用map存储每个元素出现的次数。 然后按照键值对的value逆...原创 2018-06-25 16:12:02 · 568 阅读 · 1 评论 -
LeetCode144:二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?解题思路:用栈实现, 1.打印当前节点 2.若存在右子树,则右子树入栈 3.若存在左子树,则指向左子树,否则,栈不空...原创 2018-06-22 16:39:14 · 270 阅读 · 0 评论 -
二叉树的层次遍历
1.LEETCODE102 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 解题思路: 1.逐层添加到队列例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ ...原创 2018-06-21 16:19:00 · 2606 阅读 · 0 评论 -
LeetCode55. 跳跃游戏
LeetCode55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。 示例 2: 输入: [3,2,1,0,...原创 2018-06-06 21:07:43 · 850 阅读 · 0 评论 -
LEETCODE-缺失的第一个正数41
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 说明: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。解题思路: 第一...原创 2018-06-06 16:26:55 · 217 阅读 · 0 评论 -
LETCODE 658. Find K Closest Elements
【658】 Find K Closest Elements Given a sorted array, two integers k and x, find the k closest elements to x in the array. The result should also be sorted in ascending order. If there is a tie, the s...原创 2018-06-06 15:33:18 · 166 阅读 · 0 评论 -
LEETCODE593:有效的正方形
问题描述: 给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。一个点的坐标(x,y)由一个有两个整数的整数数组表示。 示例: 输入: p1 = [0,0], p2 = [1,1], p3 = [1,0], p4 = [0,1] 输出: True注意: 所有输入整数都在 [-10000,10000] 范围内。 一个有效的正方形有四个等长的正长和四个等角(9...原创 2018-04-29 22:40:03 · 688 阅读 · 0 评论 -
判断完全平方数与不使用Sqrt函数求开方
1、完全平方数的尾数为0,1,4,5,6,9 2.由于1+3+5+…+(2n-1) = (2n-1+1)*n/2 = n^2依据该公式可以得出完全平方式的求解过程: public boolean isPerfectSquare(int num) { int left = num%10; if(!(left==0||left==1||left==4||lef...原创 2018-03-12 22:10:02 · 3025 阅读 · 0 评论 -
LeetCode 234. 回文链表
请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true解题思路: 1.快慢指针找到中点 2.将链表分为左右两个链表 3.将右边的链表逆序 4.对比左右链表是否相等(右边链表长度可能比左边链表少1 因此右边链表为空时结束循环)/** ...原创 2018-06-27 10:03:07 · 328 阅读 · 0 评论 -
LeetCode148. 排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3 输出: 1->2->3->4 示例 2:输入: -1->5->3->4->0 输出: -1->0->3->4->5解题思路: 归并排序/** * Definition fo原创 2018-06-27 11:00:34 · 517 阅读 · 0 评论 -
剑指offer--数组中的逆序对
问题描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数...原创 2018-09-02 16:15:17 · 112 阅读 · 0 评论 -
LeetCode106. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:3 / \ 9 20 / \ 15 7采用递归的思想: 将手动计算的方法转换为代码实现。 用手画一下,...原创 2018-08-30 11:29:07 · 185 阅读 · 0 评论 -
LeetCode105. 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树:3 / \ 9 20 / \ 15 7解题思路:采用递归 根据:1.preorder 数组的开始节点为根节...原创 2018-08-29 20:28:27 · 128 阅读 · 0 评论 -
击鼓传花
问题描述: 学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏。游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开始之后拿着花的同学开始传花,每个同学都可以把花传给自己左右的两个同学中的一个(左右任意),当主持人停止击鼓时,传花停止,此时,正拿着花没传出去的那个同学就要给大家表演一个节目。 聪明...原创 2018-08-31 10:17:02 · 1398 阅读 · 0 评论 -
LeetCode:递增的三元子序列
问题描述: 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1, 使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。...原创 2018-08-08 00:42:15 · 696 阅读 · 0 评论 -
大数的M进制转换为N进制(M和N的取值范围为2~62)
很久以前遇到的一个问题,今天找了一下解决方案:https://blog.csdn.net/SJF0115/article/details/8690581 感谢sjf0115的分享。理清楚上述博客的思想后,自己写了一遍代码,以整理思路。 具体做法其实就是求余数,然后将余数逆序拼接就是。 下面代码解释如下; 1.进制的表示用0-9 A-Z a-z 2.循环求余数。每次循环从第一位开始...原创 2018-08-07 12:14:29 · 1701 阅读 · 1 评论 -
最长公共子串问题
采用动态规划的思想。 使用二维数组,每个元素dp[i][j]表示以 A[i-1] B[j - 1]结尾的最大公共子串import java.util.Scanner;/** * Created by zfr on 2018/08/02. * 最长公共子串问题 */public class LCS{ public static void main(String[] arg...原创 2018-08-02 11:26:21 · 215 阅读 · 0 评论 -
数字比较-牛客网
问题描述: 牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。 由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出”>”,小于则输出”<”,等于则输出”=”。 输入描述: 两个数字x和y。 满足1 <= x,...原创 2018-08-14 09:37:09 · 541 阅读 · 0 评论 -
寻找第一个出现次数最少的字符
同理寻找第一个出现次数最少的字符,一次循环的还没想好import java.util.HashMap;import java.util.Map;import java.util.Scanner;/** * Created by zfr on 2018/08/05. * 寻找第一个出现次数最少的字符 */public class Solution { public st...原创 2018-08-05 14:33:26 · 479 阅读 · 0 评论 -
寻找第一个出现次数最多的字符
这道题起始很简单,就是遍历,存储每个字符出现的次数。可以在存储次数的过程中得到最少次数,也可以增加一次遍历。 本次由三次循环修改到一次循环,回头看第一次写出了的三次循环,觉得自己脑回路有点长๐·°(৹˃̵﹏˂̵৹)°·๐。import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import ja...原创 2018-08-05 10:47:44 · 926 阅读 · 2 评论 -
不使用比较运算符求出两个数的大小
有两个数a,b,不使用比较运算符求两个数中较大的数和较小的数 Max(a,b) = ((a+b)+|a-b|)/2 Min(a,b) = (a+b - |a-b|)/2原创 2018-07-09 20:05:27 · 624 阅读 · 0 评论 -
LeetCode481. 神奇字符串
神奇的字符串 S 只包含 ‘1’ 和 ‘2’,并遵守以下规则:字符串 S 是神奇的,因为串联字符 ‘1’ 和 ‘2’ 的连续出现次数会生成字符串 S 本身。字符串 S 的前几个元素如下:S = “1221121221221121122 ……”如果我们将 S 中连续的 1 和 2 进行分组,它将变成:1 22 11 2 1 22 1 22 11 2 11 22 ……并且每个组中 ...原创 2018-07-09 16:36:57 · 1215 阅读 · 0 评论 -
Leetcode147. 对链表进行插入排序
题目描述 https://leetcode-cn.com/problems/insertion-sort-list/description/ 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。插入排序算法:插入排序是迭代的,每次只移动一个...原创 2018-06-27 17:18:26 · 956 阅读 · 0 评论 -
快乐数
问题描述: 写一个算法来判断一个数是不是“快乐数”。一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,或是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。 案例: 19 是一个快乐数。 1^2 + 9^2 = 82 8^2 + 2^2 = 68 6^2 + 8^2 = 1...原创 2018-04-13 15:49:37 · 259 阅读 · 0 评论 -
有效的括号字符串
问题描述 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则: -任何左括号 ( 必须有相应的右括号 )。 -任何右括号 ) 必须有相应的左括号 ( 。 -左括号 ( 必须在对应的右括号之前 )。 -*可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。 -一个空字符串也被视为有效字符串。 例 1: ...原创 2018-04-13 15:36:26 · 305 阅读 · 0 评论 -
只出现一次的数II
给定一个整型数组,除了一个元素只出现一次外,其余每个元素都出现了三次。求出那个只出现一次的数。 解体思路: 整型数占32位,可以记下所有数每一位的总数,然后每一位对3取余,剩下的就是那个只出现了一次的数。class Solution { public int singleNumber(int[] nums) { if (nums.length == 1) ...原创 2018-04-12 20:33:41 · 103 阅读 · 0 评论 -
剑指offer--(14)数值的整数次方
剑指offer–(14)数值的整数次方问题描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 解题思路 利用Java的Math.Power(double,double)函数。原创 2017-09-17 08:14:02 · 223 阅读 · 0 评论 -
剑指offer--(13)二进制中1的个数
剑指offer–(11)二进制中1的个数问题描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路描述 利用”与”操作,不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0,这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有M个1,那么这个方法只需要循环k次即可,所以其时间复杂度O(M),eg: 111&110 =110原创 2017-09-17 08:04:19 · 564 阅读 · 0 评论 -
剑指offer--(12) 矩形覆盖
剑指offer–(10) 矩形覆盖* 问题描述* 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路描述 f(0)= 0; f (1) =1; f(2) =2 f(3)=f(3-1)+f(3-2)=3 即为斐波那列数。原创 2017-09-17 08:03:01 · 559 阅读 · 0 评论 -
剑指offer--(11)二进制中1的个数
剑指offer–(11)二进制中1的个数问题描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路描述 利用”与”操作,不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0,这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有M个1,那么这个方法只需要循环k次即可,所以其时间复杂度O(M),eg: 111&110 =110原创 2017-09-16 21:28:50 · 214 阅读 · 0 评论 -
剑指offer--(10) 矩形覆盖
剑指offer–(10) 矩形覆盖* 问题描述* 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?原创 2017-09-16 21:12:03 · 219 阅读 · 0 评论 -
剑指offer--(9) 变态跳台阶
剑指offer–(9) 变态跳台阶问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路描述:f(n)=2f(n-1)原创 2017-09-16 20:11:59 · 210 阅读 · 0 评论 -
剑指offer--(8) 跳台阶
剑指offer–(8) 跳台阶题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路描述 1. 第一步可以跳一阶或两阶,那么剩余台阶数为n-1或n-2,那么跳台阶的种数为f(n-1)+f(n-2) 2. 最后能跳完,则表示该跳法可行,返回1; 3. 剩余步数为负数,则该跳法不可行,返回0原创 2017-09-16 14:13:36 · 189 阅读 · 0 评论 -
剑指offer--(7) 斐波那契数列
剑指offer–(7) 斐波那契数列题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39 解题思路 1. f(0)=0,f(1)=1,f(2)=1,… 2. 递推公式为:f(n)=f(n-1)+f(n-2) 3. 采用递归方式Java 实现原创 2017-09-16 13:56:48 · 251 阅读 · 0 评论