剑指OFFER 03-11
剑指 Offer 03. 数组中重复的数字
难度简单143
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
限制:
2 <= n <= 100000
class Solution {
public:int findRepeatNumber(vector<int>& nums) {unordered_map<int,int> mp;for(int i=0;i<nums.size();i++){if(mp.count(nums[i])) return nums[i];mp[nums[i]]++; }return -1;}
};
剑指 Offer 04. 二维数组中的查找
难度简单124收藏分享切换为英文关注反馈
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 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
。
限制:
0 <= n <= 1000
0 <= m <= 1000
class Solution {
public:bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {//定一个初始位置,使得更大or更小都有固定的方向走//初始定左下角。//为什么要写matrix...?if(matrix.size()==0||matrix[0].size()==0) return false;int i=matrix.size()-1,j=0;while(i>=0&&j<matrix[0].size())if(matrix[i][j]==target) return true;else if(matrix[i][j]>target) i--;else j++;return false;}
};
剑指 Offer 05. 替换空格
难度简单35
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy." 输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
class Solution {
public:string replaceSpace(string s) {for(int i=0;i<s.length();i++){if(s[i]==' '){s.replace(i,1,"%20");}}return s;}
};
剑指 Offer 06. 从尾到头打印链表
难度简单45
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2] 输出:[2,3,1]
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:vector<int> reversePrint(ListNode* head) {// if(head==NULL) return NULL;vector<int> v;while(head!=NULL){v.push_back(head->val);head=head->next;}reverse(v.begin(),v.end());return v;}
};
剑指 Offer 07. 重建二叉树
难度中等170
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3/ \9 20/ \15 7
限制:
0 <= 节点个数 <= 5000
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* build(vector<int> preorder,vector<int> inorder,int lp,int rp,int li,int ri){if(lp>rp) return NULL;if(lp==rp) return new TreeNode(preorder[lp]);TreeNode* root=new TreeNode(preorder[lp]);//根结点//根据中序遍历分出左右子树int j=li;while(j!=ri&&inorder[j]!=preorder[lp]) j++;int len=j-li;root->left=build(preorder,inorder,lp+1,lp+len,li,j-1);root->right=build(preorder,inorder,lp+len+1,rp,j+1,ri);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {//前序遍历和中序遍历TreeNode* root=NULL;root=build(preorder,inorder,0,preorder.size()-1,0,inorder.size()-1);return root;}
};
剑指 Offer 09. 用两个栈实现队列
难度简单103
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1 )
示例 1:
输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1]
示例 2:
输入: ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"] [[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
class CQueue {
public:stack<int> s1,s2;CQueue() {}void appendTail(int value) {s2.push(value);}int deleteHead() {//如果栈1空,那么栈2元素转到栈1if(s1.empty()){while(!s2.empty()){int x=s2.top();s2.pop();s1.push(x);}}//弹出栈1元素if(s1.empty()) return -1;else{int x=s1.top();s1.pop();return x;}}
};/*** Your CQueue object will be instantiated and called as such:* CQueue* obj = new CQueue();* obj->appendTail(value);* int param_2 = obj->deleteHead();*/
剑指 Offer 10- I. 斐波那契数列
难度简单48
写一个函数,输入 n
,求斐波那契(Fibonacci)数列的第 n
项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2 输出:1
示例 2:
输入:n = 5 输出:5
class Solution {
public:int fib(int n) {if(n==0||n==1) return n;vector<int> f(n+1);f[0]=0;f[1]=1;for(int i=2;i<=n;i++) f[i]=(f[i-1]+f[i-2])%(1000000007);// cout<<dp[3];return f[n];}
};
剑指 Offer 10- II. 青蛙跳台阶问题
难度简单54
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n
级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2 输出:2
示例 2:
输入:n = 7 输出:21
示例 3:
输入:n = 0 输出:1
提示:
0 <= n <= 100
class Solution {
public:int numWays(int n) {if(n==0) return 1;if(n<=2) return n;vector<int> f(n+1);f[0]=1;f[1]=1;f[2]=2;for(int i=3;i<=n;i++){f[i]=(f[i-1]+f[i-2])%(1000000007);}return f[n];}
};
剑指 Offer 11. 旋转数组的最小数字
难度简单133
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2]
为 [1,2,3,4,5]
的一个旋转,该数组的最小值为1。
示例 1:
输入:[3,4,5,1,2] 输出:1
示例 2:
输入:[2,2,2,0,1] 输出:0
//暴力
class Solution {
public:int minArray(vector<int>& numbers) {//前面一直递增,然后突然变小//即为所求for(int i=0;i<numbers.size();i++){if(i+1<numbers.size()&&numbers[i]>numbers[i+1])return numbers[i+1];}return numbers[0];}
};
//二分
public int minArray(int[] numbers) {int left = 0, right = numbers.length - 1;while (left < right) {//找出left和right中间值的索引int mid = left + (right - left) / 2;if (numbers[mid] > numbers[right]) {//如果中间值大于最右边的值,说明旋转之后最小的//数字肯定在mid的右边,比如[3, 4, 5, 6, 7, 1, 2]left = mid + 1;} else if (numbers[mid] < numbers[right]) {//如果中间值小于最右边的值,说明旋转之后最小的//数字肯定在mid的前面,比如[6, 7, 1, 2, 3, 4, 5],//注意这里mid是不能减1的,比如[3,1,3],我们这里只是//证明了numbers[mid]比numbers[right]小,但有可能//numbers[mid]是最小的,所以我们不能把它给排除掉right = mid;} else {//如果中间值等于最后一个元素的值,我们是没法确定最小值是// 在mid的前面还是后面,但我们可以缩小查找范围,让right// 减1,因为即使right指向的是最小值,但因为他的值和mid// 指向的一样,我们这里并没有排除mid,所以结果是不会有影响的。//比如[3,1,3,3,3,3,3]和[3,3,3,3,3,1,3],中间的值//等于最右边的值,但我们没法确定最小值是在左边还是右边right--;}}return numbers[left];
}作者:sdwwld
链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/liang-chong-jie-jue-fang-shi-du-ji-bai-liao-100de-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
剑指OFFER 03-11相关推荐
- 剑指 Offer 03——10
@Author:Runsen 决定重新刷剑指 Offer,C++和Py版本 03. 数组中重复的数字 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 方法: 排序 遍历.set和 ...
- 剑指 Offer第 11 天 双指针(简单)
第 11 天双指针(简单) 剑指 Offer 18. 删除链表的节点 题目描述 题目思路及代码 剑指 Offer 22. 链表中倒数第k个节点 题目描述 题目思路及代码 推荐给大家一句话 剑指 Off ...
- 剑指Offer #03 从尾到头打印链表(递归)
题目来源:牛客网-剑指Offer专题 题目地址:从尾到头打印链表 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 题目解析 方法一: 因为题目要求返回的顺序是从尾到头,所以我 ...
- 【菜鸡新手 - 剑指offer 03】[2021/1/17一刷] 找出数组中重复的数字 -三种解法|| 物归原主,测试碰撞法 || hash表测试碰撞法 || 排序+遍历法 ||python
文章目录 题目解读 A. 书籍推荐解法:我起名为" 物归原主,测试碰撞"法 B. 基础尝试1:hash表 + 碰撞测试 (效果还行) C. 基础尝试2:排序+遍历 (效果差) C. ...
- 【LeetCode笔记】剑指 Offer 03. 数组中重复的数字(Java、哈希表、原地算法)
文章目录 题目描述 思路 & 代码 二刷 题目描述 倒是和leetcode 287 寻找重复数很像..但是不能使用那道题的快慢指针法(也可能是我太菜了) 重点在于题干的描述[长度为 n 的数组 ...
- Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)
找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复 ...
- 【三种解法实现】剑指 Offer 03. 数组中重复的数字
立志用最少的代码做最高效的表达 题目链接-->传送门 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数 ...
- leetcode 剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 剑指 Offer 03. 数组中重复的数字()
在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 解题思路 原 ...
- 【算法】剑指 Offer 03. 数组中重复的数字
1.概述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...
最新文章
- 【业界】Facebook的基础AI算法是如何驱动社交网络的发展?
- 2019 CES展上最受外媒体关注的中国机器人产品及技术
- UVa11882,Biggest Number
- 为什么装了ACDSEE 就不能点网站上的连接?
- [Abp 源码分析]ASP.NET Core 集成
- RHEL6.2手动封装rpm源码包安装星际译王
- java常用的正则表达式
- 程序员如何在 HTTPS 中高效配置通配符证书?| 技术头条
- javaScript与MVC
- html表单制作选择,html表单(html表单制作及实例)
- 9个设计师常用的高清图库 不敢配图? 这9个免版权图库牢记心中!
- stylecloud 自定义蒙版
- CheXNet-master:CUDA out of memery
- Android——RecyclerView——Recycler类全部源码翻译及注释
- Windows7旗舰版SP1_32位2018.10(装机版)
- Dreamweaver CS6 新建站点
- 聊聊短信接口攻击的防范方案
- Spark ML 特征工程之 One-Hot Encoding
- CSDN之博客积分规则
- CentOS7 nginx反向代理TCP端口