剑指offer
zwzsdy
升级打怪中...
展开
-
剑指offer-二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数public class Solution { public boolean Find(int target, int [][] array) { if(array==null||ar...原创 2018-04-08 20:25:23 · 92 阅读 · 0 评论 -
剑指offer-反转链表
题目描述 输入一个链表,反转链表后,输出链表的所有元素很简单:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public List...原创 2018-04-18 22:56:33 · 129 阅读 · 0 评论 -
剑指offer-合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。很容易想到,每个链表从头开始比较,选择其中较小的,然后该链表后移一位继续与前面为移动的比较,知道一个链表为空时,直接赋值。就是链表节点的引用关系比较难以理清。递归代码:public class Solution { public ListNode Merge(ListNode...原创 2018-04-19 09:32:40 · 143 阅读 · 0 评论 -
买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 ...原创 2018-05-01 12:06:53 · 281 阅读 · 0 评论 -
LeetCode-打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷...原创 2018-05-01 12:46:11 · 1026 阅读 · 0 评论 -
区域和检索 - 不可变
给定一个数组,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。例如:给定nums = [-2, 0, 3, -5, 2, -1],求和函数为sumRange()sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3笔者第一个想到的就是,这么简单?直接...原创 2018-05-01 13:15:35 · 734 阅读 · 0 评论 -
剑指offer——顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.刚开始,笔者也是没有头绪的,感觉循环条件不好写。后面在评论区看到了这种魔方解法,觉得这个想法甚是清奇,用Python实现非常方便,但...原创 2018-05-01 21:14:20 · 181 阅读 · 0 评论 -
leetcode-最大子序和(四种)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。这道题在LeetCode中被归类为简单类,但是,却有三种甚至更多的解法,值得探讨。1.暴力破解法——时间效率O(N^3),超时 这是最容...原创 2018-04-21 14:58:08 · 35103 阅读 · 12 评论 -
剑指offer-树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)递归思想:我们想从当前节点,作为匹配的根节点开始找,如果返回FALSE,则递归选择左子树,然后是右子树。public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { ...原创 2018-04-21 21:06:55 · 155 阅读 · 0 评论 -
剑指offer-二叉树镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10...原创 2018-04-21 21:29:59 · 142 阅读 · 0 评论 -
LeetCode—— 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例:输入: numbers = [2, 7, 11, 15],...原创 2018-05-04 17:31:13 · 1477 阅读 · 0 评论 -
LeetCode——缺失数字&旋转数组
给定一个数组,输出这个数组中元素向右边移动K位的新数组,要求算法的时间复杂度是O(n),空间复杂度是O(1) 例如,数组array={1,2,3,4,5,6},其中元素向右边移动4位的新数组为{3,4,5,6,1,2}解法:1.用额外空间存储 2。先将整个数组翻转,然后翻转前k个,再翻转剩下的(k%=nums.length—-避免k值越界)给出一个包含 0, 1,...原创 2018-05-04 22:59:45 · 415 阅读 · 0 评论 -
剑指offer-链表中倒数第k个节点
题目描述 输入一个链表,输出该链表中倒数第k个结点这道题其实很简单,设置两个节点,开始时都指向头,根据k来确定前一个走了多少步长之后,指向结果的节点才开始走, 刚开始笔者陷入了误区,哎,想通过计数的方式来完成距离控制,后来发现只需在第一次进行控制即可。/*public class ListNode { int val; ListNode next = null; ...原创 2018-04-18 12:41:42 · 116 阅读 · 0 评论 -
剑指offer-调整数组使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。对于这个数组,要求偶数位于后面,奇数位于前面,重点在于要求奇数与奇数、偶数与偶数相对位置不变,其实,我们这样想: 使用一个临时等大于array的数组temp来存储结果。我们对于奇数与偶数进行分别遍历,虽然这样会...原创 2018-04-17 23:53:57 · 127 阅读 · 0 评论 -
剑指offer-替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。public class Solution { public String replaceSpace(StringBuffer str) { int spaceCount=0; //计算出有...原创 2018-04-08 20:29:28 · 101 阅读 · 0 评论 -
剑指offer-从头到尾打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/imp...原创 2018-04-08 20:31:35 · 101 阅读 · 0 评论 -
剑指offer-重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。相信大家对于这道题的原理应该很清楚了,很容易想到这是一个递归思想,但是笔者的代码在本地IDE中所有测试用例均正确,在牛客网却提示相同的测试用例发生了...原创 2018-04-09 20:42:56 · 82 阅读 · 0 评论 -
剑指offer-用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。这道题目很简单,不能使用其他数据结构,这里我们将一个栈作为队列入队,另一个栈作为出队。可知,队列入队顺序与栈出顺序相反。public class Solution { Stack<Integer> stack1 = new Stack<Integer>()...原创 2018-04-09 21:06:15 · 120 阅读 · 0 评论 -
剑指offer-旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。非递减序列,即递增或者存在相同元素的序列。通过分析我们能够知道,第一个数字肯定大于最后一个数字(否则就没有...原创 2018-04-15 11:50:53 · 110 阅读 · 0 评论 -
剑指offer-斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39这道题目描述简单,如果使用暴力法也是能够计算出结果的,但是既然是算法,我们必然要考虑时间复杂度。我们可以有这样一个递推公式:[Fib(n+1)Fib(n)]=[1110][Fib(n+1)Fib(n)]=[1110]\begin{bmatrix}Fib(n+1) \\Fib(n...原创 2018-04-15 12:03:31 · 174 阅读 · 2 评论 -
剑指offer-跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目很简单,一个递归搞定。public class Solution { int count=0; public int JumpFloor(int target) { if(target==0) {count++;return 0;} ...原创 2018-04-15 15:25:17 · 539 阅读 · 0 评论 -
剑指offer-变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。这是上一道题的升级版,不过递推思想还是一样: 我们从后往前想: 1.当n级台阶时,假设有n中跳法 2.青蛙第一次跳1级,剩下n-1级,则有n-1种跳法 3.青蛙第一次跳2级,剩下n-2级,则有n-2种跳法 ………………………. ………………………. n.青蛙一...原创 2018-04-15 16:05:11 · 349 阅读 · 0 评论 -
剑指offer-矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?题目看似与前面的题不同,实际上和前面跳台阶本质上没啥不同。 这里我们需要注意,即使我们横着将2*1的矩形放入填充(即此时高只是2*n矩形的一半),但是!!!这样填充过后,这一段就确定了,因为2*1的矩形不可能在竖着放入!! 然后就是竖着放入的方式,就很...原创 2018-04-15 16:28:49 · 109 阅读 · 0 评论 -
剑指offer-二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(刚刚做完58的笔试,嗯,伤心了刷几道题。) 直接进行位运算即可:public class Solution {public int NumberOf1(int n) { int count = 0; if(n==0)return 0; while(n!=0)...原创 2018-04-15 22:51:24 · 106 阅读 · 0 评论 -
剑指offer-数值的n次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。这个题目其实和前面的快速幂一毛一样啊,刚开始想底数是double会不会有不同,想了想,靠,没有关系。这里就只需考虑底数为0,指数为1,指数小于0时的情况。 指数我们拷贝一份,原始底数保留作为判断条件。当底数小于0时,最后我们返回的值肯定是1/result了public...原创 2018-04-17 23:16:01 · 328 阅读 · 0 评论 -
LeetCode——寻找数组中第三大的数
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。示例 1:输入: [3, 2, 1]输出: 1解释: 第三大的数是 1. 示例 2:输入: [1, 2]输出: 2解释: 第三大的数不存在, 所以返回最大的数 2 . 示例 3:输入: [2, 2, 3, 1]输出: 1解释: 注意,要求返回第三...原创 2018-05-05 22:24:43 · 7684 阅读 · 0 评论