【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题
【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题
文章目录
- 【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题
- 03. 数组中重复的数字(easy)
- 04. 二维数组中的查找(medium)
- 05. 替换空格(easy)
- 06. 从尾到头打印链表(easy)
- 07. 重建二叉树(medium)
- 09. 用两个栈实现队列(easy)
- 10-Ⅰ. 斐波那契数列(easy)
- 10-Ⅱ. 青蛙跳台阶问题(easy)
- 11. 旋转数组的最小数字(easy)
03. 数组中重复的数字(easy)
剑指 Offer 03. 数组中重复的数字
【题目】找出数组中重复的数字。
在一个长度为 n
的数组 nums
里的所有数字都在 0~n-1
的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
限制:
2 <= n <= 100000
【示例】
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
【解题思路】
方法一:Set
集合
class Solution {public int findRepeatNumber(int[] nums) {Set<Integer> set = new HashSet<>();for (int x : nums) {if (set.contains(x)) {return x;} else {set.add(x);}}return -1;}
}
方法二:排序
class Solution {public int findRepeatNumber(int[] nums) {Arrays.sort(nums);for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1]) {return nums[i];}}return -1;}
}
方法三:频次统计
class Solution {public int findRepeatNumber(int[] nums) {int []spot = new int[nums.length];for (int i : nums) {if (spot[i] == 0) {spot[i]++;} else {return i;}}return -1;}
}
方法四:
遍历nums
,将nums[i]
的值作为下标,将对应下标处的值标记为相反数,若下标nums[i]
处已经是负数,则说明数字重复出现,注意0要单独计算
class Solution {public int findRepeatNumber(int[] nums) {boolean hasZero = false;for (int i = 0; i < nums.length; i++) {int x = Math.abs(nums[i]);if (x == 0) {if (hasZero) return 0;hasZero = true;}if (nums[x] < 0) return x;nums[x] = -nums[x];}return -1;}
}
04. 二维数组中的查找(medium)
剑指 Offer 04. 二维数组中的查找
【题目】 在一个 n * m
的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
限制:
0 <= n <= 1000
0 <= m <= 1000
【示例】
现有矩阵 matrix 如下:
[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
【解题思路】
示例中的矩阵从副对角线
看就像一颗二叉查找树,左边的小于它,下边的大于它
class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;int i = matrix[0].length - 1, j = 0;while (i > -1 && j < matrix.length) {if (matrix[j][i] == target) {return true;} else if (matrix[j][i] < target) {j++;} else {i--;}}return false;}
}
05. 替换空格(easy)
剑指 Offer 05. 替换空格
【题目】请实现一个函数,把字符串 s
中的每个空格替换成"%20"
。
限制:
0 <= s 的长度 <= 10000
【示例】
输入:s = "We are happy."
输出:"We%20are%20happy."
【解题思路】
方法一:调用库函数
class Solution {public String replaceSpace(String s) {return s.replace(" ", "%20");}
}
方法二:模拟法
class Solution {public String replaceSpace(String s) {StringBuffer sb = new StringBuffer();for (char c : s.toCharArray()) {if (c == ' ') {sb.append("%20");} else {sb.append(c);}}return sb.toString();}
}
06. 从尾到头打印链表(easy)
剑指 Offer 06. 从尾到头打印链表
【题目】输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
限制:
0 <= 链表长度 <= 10000
【示例】
输入:head = [1,3,2]
输出:[2,3,1]
【解题思路】
方法一:栈
class Solution {public int[] reversePrint(ListNode head) {Stack<Integer> stack = new Stack<>();while (head != null) {stack.push(head.val);head = head.next;}int[] res = new int[stack.size()];int i = 0;while (!stack.isEmpty()) {res[i++] = stack.pop();}return res;}
}
方法二:二次遍历
class Solution {public int[] reversePrint(ListNode head) {if (head == null) return new int[]{};int count = 0;for (ListNode p = head; p != null; p = p.next) count++;int[] res = new int[count];for (ListNode p = head; p != null; p = p.next) res[--count] = p.val;return res;}
}
07. 重建二叉树(medium)
剑指 Offer 07. 重建二叉树
【题目】输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
限制:
0 <= 节点个数 <= 5000
【示例】
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:3/ \9 20/ \15 7
【解题思路】
不难发现,先序遍历数组的第一个值是根结点3
,在中序遍历的数组中,根节点将左右子树分为了左右两个子数组;在根节点之后遍历完左子树(只有一个结点9,此结点作为子树的根结点,子结点都为空)后,先序遍历中20作为右子树的根结点,在中序遍历中20又将子数组划分为两个子数组,以此递归下去…
class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {return helper(preorder, inorder, 0, 0, inorder.length - 1);}private TreeNode helper(int[] preorder, int[] inorder, int cur, int begin, int end) {if (begin > end) return null;TreeNode node = new TreeNode(preorder[cur]);int mid = begin;while (mid <= end && inorder[mid] != node.val) mid++;node.left = helper(preorder, inorder, cur + 1, begin, mid - 1);node.right = helper(preorder, inorder, cur + mid - begin + 1, mid + 1, end);return node;}
}
09. 用两个栈实现队列(easy)
剑指 Offer 09. 用两个栈实现队列
【题目】用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1
)
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
【示例】
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
--------------------------------------------------------
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
【解题思路】
详细见代码
class CQueue {Stack<Integer> sa;Stack<Integer> sb;public CQueue() {sa = new Stack<Integer>();sb = new Stack<Integer>();}public void appendTail(int value) {sa.push(value);}public int deleteHead() {if (sa.isEmpty() && sb.isEmpty()) return -1;if (sb.isEmpty()) {while (!sa.isEmpty()) sb.push(sa.pop());}return sb.pop();}
}
10-Ⅰ. 斐波那契数列(easy)
剑指 Offer 10- I. 斐波那契数列
【题目】写一个函数,输入 n
,求斐波那契(Fibonacci)数列的第 n
项(即 F(N)
)。
斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0
和 1
开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007)
,如计算初始结果为:1000000008
,请返回 1
。
提示:
0 <= n <= 100
【示例】
输入:n = 5
输出:5
【解题思路】
方法一:动态规划
class Solution {public int fib(int n) {if (n == 0 || n == 1) return n;int[] dp = new int[n + 1];dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];if (dp[i] > 1000000007) dp[i] -= 1000000007;}return dp[n];}
}
方法二:迭代法
class Solution {public int fib(int n) {if (n == 0 || n == 1) return n;int f1 = 0, f2 = 1;for (int i = 2; i <= n; i++) {int t = f2;f2 += f1;if (f2 > 1000000007) f2 -= 1000000007;f1 = t;}return f2;}
}
10-Ⅱ. 青蛙跳台阶问题(easy)
剑指 Offer 10- II. 青蛙跳台阶问题
【题目】一只青蛙一次可以跳上1
级台阶,也可以跳上2
级台阶。
求该青蛙跳上一个 n
级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007)
,如计算初始结果为:1000000008
,请返回 1
。
提示:
0 <= n <= 100
【示例】
输入:n = 7
输出:21
【解题思路】
同上斐波那契数列
class Solution {public int numWays(int n) {long f0 = 1, f = 1;for (int i = 2; i <= n; i++) {long t = f;f = (f0 + f) % 1000000007;f0 = t;}return (int)f;}
}
11. 旋转数组的最小数字(easy)
剑指 Offer 11. 旋转数组的最小数字
【题目】把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2]
为 [1,2,3,4,5]
的一个旋转,该数组的最小值为1
。
【示例】
输入:[2,2,2,0,1]
输出:0
【解题思路】
方法一:排序
【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题相关推荐
- 《剑指offer》第1~11题:刷题week1[C++题解]
文章目录 1. 找出数组中重复的数字 思路一:排序 思路二:hash表 思路三:原地交换 2. 不修改数组找出重复的数字 思路:抽屉原理+二分 3. 二维数组中的查找 思路:思维题(选取右上角的值) ...
- leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列
剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...
- [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]
[剑指offer]面试题第[57]题[Leetcode][第167题][第1题] 有序无序之分 题目输出不同之分 以下解法按照[剑指offer]面试题第[57]题进行题解 [问题描述][简单] 输入一 ...
- 【LeetCode 剑指offer刷题】矩阵题1:4 有序矩阵中的查找( 74. Search a 2D Matrix )(系列)...
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 74. Search a 2D Matrix Write an efficient algorithm that s ...
- Leetcode剑指offer(五)
Leetcode剑指offer 31从上到下打印二叉树 II(32-2.Easy) 1)题目要求 2)我的解法 3)其他解法 4)自己的优化代码 5)学到的东西 32.从上到下打印二叉树 III(32 ...
- 【LeetCode 剑指offer刷题】树题6:28 对称二叉树(101. Symmetric Tree)
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 101. Symmetric Tree /** * Definition for a binary tree no ...
- 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...
- 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 67 把字符串转成整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符 ...
- 【LeetCode 剑指offer刷题】树题16:Kth Smallest Element in a BST
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Kth Smallest Element in a BST Given a binary search tree, ...
- leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer
题目难度: 中等 原题链接 今天继续更新剑指 offer 系列, 这道题相比昨天那道题多了个每层打印方向不同的需求, 聪明的你想到应该如何实现了吗? 老样子晚上 6 点 45 分准时更新公众号 每日精 ...
最新文章
- Mysql中varchar类型的猫腻!
- 为什么全网 都在说 iOS 开发不行了 ?
- 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第10章-带有分层领航者的多智能体系统的混杂协调
- 一只青蛙跳向三个台阶_青蛙跳台阶
- 【Python】刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...
- FFmpeg优化 苏宁PP体育视频剪切效率提升技巧
- vue 分模块打包 脚手架_Vue面试官最爱的底层源码问题,你可以这样回答!
- Ranger-Yarn插件安装
- 一些特殊的电脑快捷键
- Leetcode每日一题:1002.find-common-characters(查找常用字符串)
- mysql 64位更改密码_win10卸载原mysql安装64位mysql5.7并修改root密码
- access升级mysql_将现有的Access数据库升级为SQL
- Webservice 的安全
- 20200125每日一句
- 机器学习的数学基础——线性代数篇(一)
- Android鞋店管理系统,鞋店进销管理系统下载
- ECAP等通道转角挤压详解
- dubbo服务出现大量超时问题
- 2022-02-15:扫地机器人。 房间(用格栅表示)中有一个扫地机器人。 格栅中的每一个格子有空和障碍物两种可能。 扫地机器人提供4个API,可以向前进,向左转或者向右转。每次转弯90度。 当扫地机
- 内网穿透的作用 免费内网穿透有哪些 可以用来干什么