九日集训(每日打卡) 第三天

 33. 搜索旋转排序数组

第一种用循环做,很简单

​
​// 循环
class Solution {
public:
    int search(vector& nums, int target) {
        for(int i = 0;i

第二种用二分来做

  • 因为他说在某个地方翻转了,所以就变成了两条升序的序列。
  • 第一步:二分,分开两条序列。
  • 第二步:通过判断target与nums[0]的大小比较,判断target应该在哪一段
  • 第三步:再次二分
class Solution {
public:
    int search(vector& nums, int target) {
        int l = 0,r = nums.size() - 1;
        while(l < r){ // 首先二分找两段
            int mid = l + r + 1 >> 1;
            if(nums[mid] >= nums[0]) l = mid; // 如果mid >= 0 说明mid在第一段区间里,更新l
            else r = mid - 1;
        }

        // 第二步
        if(target >= nums[0]) l = 0;
        else l = r + 1, r = nums.size() - 1; 

        //再二分,找target
        while(l < r){
            int mid = l + r >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }

        return nums[r] == target ? r : -1;
    }
};

 81. 搜索旋转排序数组 II

跟上一题一样,可以用二分也可以循环

比上一道题多了一点操作,就是删掉前一段或者后一段重复的部分,反正题目只是要判断有没有,因为是重复,删掉一段另一段也会有,不会影响最后结果。

class Solution {
public:
    bool search(vector& nums, int target) {
        if(nums.empty()) return false;
        int R = nums.size() - 1;
        while(R >= 0 && nums[R] == nums[0]) R--;
        if(R < 0)return nums[0] == target;

        int l = 0,r = R;
        while(l < r){
            int mid = l + r + 1 >> 1;
            if(nums[mid] >= nums[0]) l = mid;
            else r = mid - 1;
        }

        if(target >= nums[0]) l = 0;
        else l++,r = R;

        while(l < r){
            int mid = l + r >> 1;
            if(nums[mid] >= target) r = mid;
            else l = mid + 1;
        }
        return nums[r] == target;



    }
};

153. 寻找旋转排序数组中的最小值1

 二分没的说

class Solution {
public:
    int findMin(vector& nums) {
        int l = 0,r = nums.size() - 1;
        if(nums[r] >= nums[l]) return nums[0];
        while(l < r){
            int mid = l + r >> 1;
            if(nums[mid] < nums[0]) r = mid;
            else l = mid + 1;
        }

        return nums[r];
    }
};

 70. 爬楼梯

0        1        2        3        4        5        6        7        8

(前面的数是指从前一个台阶爬一个台阶上来,后面的数是从前两个台阶爬两个台阶上来)

1            1          1+1        2+1       3+2        5+3        8+5 。。。。。

所以我们能看出来每一个是前两个的和,也就是斐波那契额数列

class Solution {
public:
    int climbStairs(int n) {
        int a = 1,b = 1;
        while(--n){
            int c = a + b;
            a = b,b = c;
        }
        return b;
    }
};

 509. 斐波那契数

斐波那契递归

class Solution {
public:
    int fib(int n) {
        if(n == 0) return 0;
        if(n <= 2) return 1;
        return fib(n - 1) + fib(n - 2);
    }
};

1137. 第 N 个泰波那契数

就照葫芦画瓢

class Solution {
public:
    int tribonacci(int n) {
        if(n == 0) return 0;
        if(n < 3) return 1;
        
        int a = 0,b = 1,c = 1;
        n = n-2;
        while(n--){
            int d = a + b + c;
            a = b,b = c,c = d;
        }
        
        return c;
    }
};

你可能感兴趣的:(每日LeetCode,算法,leetcode)