剑指 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

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,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相关推荐

  1. 剑指 Offer 03——10

    @Author:Runsen 决定重新刷剑指 Offer,C++和Py版本 03. 数组中重复的数字 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 方法: 排序 遍历.set和 ...

  2. 剑指 Offer第 11 天 双指针(简单)

    第 11 天双指针(简单) 剑指 Offer 18. 删除链表的节点 题目描述 题目思路及代码 剑指 Offer 22. 链表中倒数第k个节点 题目描述 题目思路及代码 推荐给大家一句话 剑指 Off ...

  3. 剑指Offer #03 从尾到头打印链表(递归)

    题目来源:牛客网-剑指Offer专题 题目地址:从尾到头打印链表 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 题目解析 方法一: 因为题目要求返回的顺序是从尾到头,所以我 ...

  4. 【菜鸡新手 - 剑指offer 03】[2021/1/17一刷] 找出数组中重复的数字 -三种解法|| 物归原主,测试碰撞法 || hash表测试碰撞法 || 排序+遍历法 ||python

    文章目录 题目解读 A. 书籍推荐解法:我起名为" 物归原主,测试碰撞"法 B. 基础尝试1:hash表 + 碰撞测试 (效果还行) C. 基础尝试2:排序+遍历 (效果差) C. ...

  5. 【LeetCode笔记】剑指 Offer 03. 数组中重复的数字(Java、哈希表、原地算法)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 倒是和leetcode 287 寻找重复数很像..但是不能使用那道题的快慢指针法(也可能是我太菜了) 重点在于题干的描述[长度为 n 的数组 ...

  6. Leetcode 剑指 Offer 03. 数组中重复的数字 (每日一题 20210614)

    找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复 ...

  7. 【三种解法实现】剑指 Offer 03. 数组中重复的数字

    立志用最少的代码做最高效的表达 题目链接-->传送门 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数 ...

  8. leetcode 剑指 Offer 03. 数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  9. 剑指 Offer 03. 数组中重复的数字()

    在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 解题思路 原 ...

  10. 【算法】剑指 Offer 03. 数组中重复的数字

    1.概述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

最新文章

  1. 【业界】Facebook的基础AI算法是如何驱动社交网络的发展?
  2. 2019 CES展上最受外媒体关注的中国机器人产品及技术
  3. UVa11882,Biggest Number
  4. 为什么装了ACDSEE 就不能点网站上的连接?
  5. [Abp 源码分析]ASP.NET Core 集成
  6. RHEL6.2手动封装rpm源码包安装星际译王
  7. java常用的正则表达式
  8. 程序员如何在 HTTPS 中高效配置通配符证书?| 技术头条
  9. javaScript与MVC
  10. html表单制作选择,html表单(html表单制作及实例)
  11. 9个设计师常用的高清图库 不敢配图? 这9个免版权图库牢记心中!
  12. stylecloud 自定义蒙版
  13. CheXNet-master:CUDA out of memery
  14. Android——RecyclerView——Recycler类全部源码翻译及注释
  15. Windows7旗舰版SP1_32位2018.10(装机版)
  16. Dreamweaver CS6 新建站点
  17. 聊聊短信接口攻击的防范方案
  18. Spark ML 特征工程之 One-Hot Encoding
  19. CSDN之博客积分规则
  20. CentOS7 nginx反向代理TCP端口

热门文章

  1. 软件造价评估:如何估算测试工作量?
  2. snidel 2014春夏新品 画册款切换材质连衣裙
  3. 银行中的等额本息,及其与等额本金的对比
  4. 查看电脑支持的最大内存数。
  5. win10无法开启适用于linux的windows的子系统,重启后一直撤销申请
  6. Lumen企业站内容管理实战 - 网站配置
  7. IM开发干货分享:我是如何解决大量离线消息导致客户端卡顿的
  8. Azure text-to-speech 语音合成 中文晓晓情感API使用及教程
  9. OpenMV颜色阈值设置
  10. 软文营销成功案例:如何进行媒体宣发-世媒讯