• 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

初始思路:旋转数组必然是两个非递减序列的拼接,在连接处才可能出现前项大于后项。

class Solution {
public:int minNumberInRotateArray(vector<int> rotateArray) {for(int i=0;i<rotateArray.size()-1;i++){if(rotateArray[i]>rotateArray[i+1]){return rotateArray[i+1];}}return 0;}
};

最佳思路:二分查找分界线。

如果中间元素大于第一个元素,则中间元素位于前面的递增子数组,此时最小元素位于中间元素的后面。我们可以让第一个指针left指向中间元素。移动之后,第一个指针仍然位于前面的递增数组中。如果中间元素小于第一个元素,则中间元素位于后面的递增子数组,此时最小元素位于中间元素的前面。我们可以让第二个指针right指向中间元素。移动之后,第二个指针仍然位于后面的递增数组中。

由于本题不是严格递增序列,还需要考虑left,right,mid指向数组元素都相同时的特殊情况,出现此情况只能顺序查找。

class Solution {
public:    int minNumberInRotateArray(vector<int> rotateArray) {int size = rotateArray.size();        if(size == 0){            return 0;        }     int left = 0,right = size - 1;        int mid = 0;            while(rotateArray[left] >= rotateArray[right]){                        if(right - left == 1){                mid = right;                break;            }           mid = left + (right - left) / 2;     if(rotateArray[left] == rotateArray[right] && rotateArray[left] == rotateArray[mid]){                return MinOrder(rotateArray,left,right);            }      if(rotateArray[mid] >= rotateArray[left]){                left = mid;            }       else{right = mid;            }       }        return rotateArray[mid];    }private:      int MinOrder(vector<int> &num,int left,int right){        int result = num[left];        for(int i = left + 1;i < right;++i){            if(num[i] < result){                result = num[i];            }      }     return result;    }};
  • 斐波那契数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

思路:斐波那契数列:f[n]=f[n-1]+f[n-2]。切记不要用递归,重复计算次数太多,会发生栈溢出。

用循环解决,可以开数组,需要消耗内存空间。实际只和两个变量f[n-1]和f[n-2]有关。

class Solution {
public:int Fibonacci(int n) {if(n<=0)return 0;if(n==1||n==2)return 1;int t1=1;int t2=1;for(int i=3;i<=n;i++){t2=t1+t2;t1=t2-t1;}return t2;}
};
  • 跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:最简单的动规。递推公式等于斐波那契数列。与上题相同,初始值稍有改动,t2=2。

  • 变态跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

初始思路:按上题想法思考,递推公式为:f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)

class Solution {
public:int jumpFloorII(int number) {int dp[number+1]; int sum=0;   for(int i=1;i<=number;i++){dp[i]=sum+1;sum=sum+dp[i];}return dp[number];}
};

最佳思路:其实递推公式可优化。

f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) =
f(0) + f(1) + f(2) + f(3) + … + f(n-2)

f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) +
f(n-1) = f(n-1) + f(n-1)

可以得出: f(n) = 2*f(n-1) = 2^(n-1)

class Solution {
public:int jumpFloorII(int number) {return  1<<--number;}
};
  • 矩形覆盖

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:因为大矩形是2*n的,最小单位覆盖方式有两种,一个竖放和两个横放。转变为上面的跳台阶问题。

  • 二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路:一道常见的笔试题,给出代码求答案那种233。

class Solution {
public:int  NumberOf1(int n) {int count=0;while(n){n=n&(n-1);count++;}return count;}
};

剑指offer(三)相关推荐

  1. 剑指Offer三天挑战赛03~15

    文章目录 剑指 Offer 03. 数组中重复的数字 解 剑指 Offer 04. 二维数组中的查找 解 剑指 Offer 05. 替换空格 解 剑指 Offer 06. 从尾到头打印链表 解 剑指 ...

  2. 剑指Offer三天挑战赛16~32

    文章目录 剑指 Offer 16. 数值的整数次方 解 剑指 Offer 17. 打印从1到最大的n位数 解 剑指 Offer 18. 删除链表的节点 解 剑指 Offer 19. 正则表达式匹配 解 ...

  3. 剑指offer三十六之两个链表的第一个公共结点

    一.题目 输入两个链表,找出它们的第一个公共结点. 二.思路 如果存在共同节点的话,那么从该节点,两个链表之后的元素都是相同的.也就是说两个链表从尾部往前到某个点,节点都是一样的.我们可以用两个栈分别 ...

  4. 剑指offer三:从尾到头打印链表

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. package com.jianzhioffer;import java.util.ArrayList; import ja ...

  5. 剑指offer(三):从尾到头打印链表

    题目: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解决办法: 可以先使用递归遍历到最后一个,再从后往前打印即可 代码: 1 import java.util.ArrayList ...

  6. 剑指offer三从头到尾打印链表

    一.题目: 输入一个链表,从尾到头打印链表每个节点的值. 二.解题方法: 方法一:采用递归的方式实现 方法二:借助堆栈的"后进先出"实现 import java.util.Arra ...

  7. 剑指offer(三十三)-丑数(Java版)

    描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 示例1 输 ...

  8. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  9. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现

    剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...

  10. 三天刷完《剑指OFFER编程题》--Java版本实现(第三天)

    正在更新中......... 剑指offer --Python版本的实现: 剑指offer(1/3)第一大部分 剑指offer(2/3)第二大部分 剑指offer(3/3)第三大部分 -------- ...

最新文章

  1. Python基础最常用且重要的模块总结----建议收藏
  2. 服务器选哪个系统,服务器选择哪个操作系统
  3. python有哪些方向、应该怎么学-大牛5大方向分析,完整Python 学习路线墙裂推荐!...
  4. python动态显示数据_python中plot实现即时数据动态显示方法
  5. Java解析Rss(三)
  6. 基于C语言、线性表的 二、八、十、十六进制转换 及 加运算、左右移位运算、乘法运算 的科学计算器设计
  7. Swift开发实例:苹果Swift编程语言新手教程中文版+FlappyBird,2048游戏源代码
  8. 点击button自动提交表单原因及解决方案
  9. 高薪、稀缺人才必备哪些技能?BDTC大会告诉你,附最新议程!
  10. [AHK]从QQ音乐网站下载歌曲
  11. OFD文件在线阅读器
  12. 《计算机场地安全要求》最新版,计算机场地安全要求gb936200x.doc
  13. win7系统没有telnet服务器,win7没有telnet命令 win7无法使用telnet
  14. java学习之springcloud之服务注册与发现篇
  15. 特殊字符大全-希腊字母俄文注音拼音日文序集心型方形点数绘表(转载)
  16. JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网
  17. 数据库设计(理论实例)
  18. Android 内存泄露分析
  19. 计算机连接游戏手柄,电脑如何使用手柄_电脑怎么连手柄打游戏-系统城
  20. Android Studio模拟机中如何放入图片

热门文章

  1. 牛逼!程序员给鸿星尔克写了一个720°全景看鞋展厅
  2. java基础初解一:数据类型、String、运算
  3. ActiveX控件缺失解决方法
  4. 为什么嫁人要嫁IT男?
  5. 学计算机专业表情包,大学专业恶搞表情包,你中枪了吗
  6. 中国科大的毕业生去向
  7. GO语言-自定义error
  8. 前端基础-02-CSS
  9. 开通CSDN博客的第一篇文章以及博客名的由来
  10. PHP链接数据库mysql