
剑指offer
长弓Smile
这个作者很懒,什么都没留下…
展开
-
扔鸡蛋问题
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X &l...原创 2018-09-25 21:36:07 · 718 阅读 · 0 评论 -
剑指offer--数组中的逆序对
问题描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数...原创 2018-09-02 16:15:17 · 138 阅读 · 0 评论 -
击鼓传花
问题描述: 学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏。游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开始之后拿着花的同学开始传花,每个同学都可以把花传给自己左右的两个同学中的一个(左右任意),当主持人停止击鼓时,传花停止,此时,正拿着花没传出去的那个同学就要给大家表演一个节目。 聪明...原创 2018-08-31 10:17:02 · 1875 阅读 · 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 · 212 阅读 · 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 · 153 阅读 · 0 评论 -
数字比较-牛客网
问题描述: 牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。 由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出”>”,小于则输出”<”,等于则输出”=”。 输入描述: 两个数字x和y。 满足1 <= x,...原创 2018-08-14 09:37:09 · 590 阅读 · 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 · 732 阅读 · 0 评论 -
大数的M进制转换为N进制(M和N的取值范围为2~62)
很久以前遇到的一个问题,今天找了一下解决方案:https://blog.youkuaiyun.com/SJF0115/article/details/8690581 感谢sjf0115的分享。理清楚上述博客的思想后,自己写了一遍代码,以整理思路。 具体做法其实就是求余数,然后将余数逆序拼接就是。 下面代码解释如下; 1.进制的表示用0-9 A-Z a-z 2.循环求余数。每次循环从第一位开始...原创 2018-08-07 12:14:29 · 1782 阅读 · 1 评论 -
寻找第一个出现次数最少的字符
同理寻找第一个出现次数最少的字符,一次循环的还没想好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 · 525 阅读 · 0 评论 -
寻找第一个出现次数最多的字符
这道题起始很简单,就是遍历,存储每个字符出现的次数。可以在存储次数的过程中得到最少次数,也可以增加一次遍历。 本次由三次循环修改到一次循环,回头看第一次写出了的三次循环,觉得自己脑回路有点长๐·°(৹˃̵﹏˂̵৹)°·๐。import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import ja...原创 2018-08-05 10:47:44 · 971 阅读 · 2 评论 -
最长公共子串问题
采用动态规划的思想。 使用二维数组,每个元素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 · 241 阅读 · 0 评论 -
不使用比较运算符求出两个数的大小
有两个数a,b,不使用比较运算符求两个数中较大的数和较小的数 Max(a,b) = ((a+b)+|a-b|)/2 Min(a,b) = (a+b - |a-b|)/2原创 2018-07-09 20:05:27 · 696 阅读 · 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 · 1300 阅读 · 0 评论 -
Leetcode147. 对链表进行插入排序
题目描述 https://leetcode-cn.com/problems/insertion-sort-list/description/ 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。插入排序算法:插入排序是迭代的,每次只移动一个...原创 2018-06-27 17:18:26 · 1058 阅读 · 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 · 609 阅读 · 0 评论 -
LeetCode 234. 回文链表
请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true解题思路: 1.快慢指针找到中点 2.将链表分为左右两个链表 3.将右边的链表逆序 4.对比左右链表是否相等(右边链表长度可能比左边链表少1 因此右边链表为空时结束循环)/** ...原创 2018-06-27 10:03:07 · 368 阅读 · 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 · 147 阅读 · 0 评论 -
LeetCode160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。例如,下面的两个链表: 在节点 c1 开始相交。注意:如果两个链表没有交点,返回 null. 在返回结果后,两个链表仍须保持原有的结构。 可假定整个链表结构中没有循环。 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。解题思路: 1.找到两个链表长度差n后较长的链表先走n步 2,然后两个指针同时向前走,如果两个...原创 2018-06-26 14:57:22 · 1641 阅读 · 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 · 750 阅读 · 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 · 448 阅读 · 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 · 606 阅读 · 1 评论 -
LeetCode144:二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?解题思路:用栈实现, 1.打印当前节点 2.若存在右子树,则右子树入栈 3.若存在左子树,则指向左子树,否则,栈不空...原创 2018-06-22 16:39:14 · 301 阅读 · 0 评论 -
二叉树的层次遍历
1.LEETCODE102 二叉树的层次遍历 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 解题思路: 1.逐层添加到队列例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ ...原创 2018-06-21 16:19:00 · 2656 阅读 · 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 · 138 阅读 · 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 · 919 阅读 · 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 · 251 阅读 · 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 · 199 阅读 · 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 · 752 阅读 · 0 评论 -
组合总和II
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。 解集不能包含重复的组合。 示例 1: 输入: candidates = [2,3,6,7], target = 7, ...原创 2018-04-16 21:15:54 · 276 阅读 · 0 评论 -
判断链表是否有环,有环则找到入口
设置两个指针p1,p2,p1每次走1步,p2每次走2步。 当p2能与p1相遇,表明存在环。 设p1走了S步,则p2走了2S步,又因为p2比p1多走了环的长度,即环的长度为L = S。 设置头节点到入口距离为x,入口距离相遇位置为y。 则S = x+y; 而p2到入口距离为L - y ,即p2距离入口为x。 因此将p1移动到头节点,然后p1每次走一步,p2每次走1步,那么二者相遇时均走了...原创 2018-04-14 20:37:23 · 213 阅读 · 0 评论 -
组合
与全排列实现方式有异曲同工之处。 代码如下:import java.util.ArrayList;import java.util.List;public class 组合 { /** * @param args */ public static void main(String[] args) { // TODO Auto-ge...原创 2018-04-14 19:48:16 · 138 阅读 · 0 评论 -
全排列
全排列:【1,2,3】 输出: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 实现思路: 利用递归回溯法,为每个数字设置标识位,表明已使用或未使用。下面为代码实现:import java.util.ArrayList;import java.util.List;public class Permute{ /** * ...原创 2018-04-14 17:23:20 · 143 阅读 · 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 · 329 阅读 · 0 评论 -
有效的括号字符串
问题描述 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则: -任何左括号 ( 必须有相应的右括号 )。 -任何右括号 ) 必须有相应的左括号 ( 。 -左括号 ( 必须在对应的右括号之前 )。 -*可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。 -一个空字符串也被视为有效字符串。 例 1: ...原创 2018-04-13 15:36:26 · 345 阅读 · 0 评论 -
只出现一次的数II
给定一个整型数组,除了一个元素只出现一次外,其余每个元素都出现了三次。求出那个只出现一次的数。 解体思路: 整型数占32位,可以记下所有数每一位的总数,然后每一位对3取余,剩下的就是那个只出现了一次的数。class Solution { public int singleNumber(int[] nums) { if (nums.length == 1) ...原创 2018-04-12 20:33:41 · 133 阅读 · 0 评论 -
只出现一次的数
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其他所有元素均出现两次。 找出只出现一次的那两个元素。 示例: 给定 nums = [1, 2, 1, 3, 2, 5], 返回 [3, 5]. 注意: 结果的顺序并不重要,对于上面的例子 [5, 3] 也是正确答案。 你的算法应该具有线性复杂度,你能否仅使用恒定的空间复杂度来实现它? 解题思路: 1.异或运算 因为a^a =...原创 2018-04-12 19:41:20 · 204 阅读 · 0 评论 -
分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。注意:你可以假设胃口值为正。 ...原创 2018-04-12 18:44:33 · 1158 阅读 · 0 评论 -
求根叶数字总和
问题描述: 给定一个只包含 0-9 数字的二叉树,每个根到叶的路径可以代表一个数字。 例如,从根到叶路径 1->2->3则代表数字 123。 查找所有根到叶数字的总和。 例如, 1 / \ 2 3 根到叶子路径 1->2 表示数字 12。 根到叶子路径 1->3 表示数字 13。 返回总和 = 12 + 13 = ...原创 2018-04-12 17:12:42 · 398 阅读 · 0 评论 -
一个数组中,只有一个数字仅出现一次,其他数字均出现两次,找出这个数字
要求:不借助任何空间 我们知道:a^0 = a,a^a = 0,因此这里可以借助异或运算可以实现。 具体实现如下:public class SingleNum { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated ...原创 2018-04-08 19:20:22 · 6339 阅读 · 0 评论 -
链表逆序
不借助栈、数组等额外的空间实现链表的逆序(手动在草稿纸上绘制一下过程,很容易理解)class MyList{ int val; MyList next; public MyList(int val) { // TODO Auto-generated constructor stub this.val = val; thi...原创 2018-04-08 09:53:20 · 168 阅读 · 0 评论