• 代码随想录33|509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯, 34. 在排序数组中查找元素的第一个和最后一个位置


    509. 斐波那契数

    链接地址

    class Solution {
    public:
        int fib(int n) {
            if (n <= 1) return n;
            vector<int> dp(n + 1);
            dp[0] = 0;
            dp[1] = 1;
            for (int i = 2; i < n + 1; i++) {
                dp[i] = dp[i - 1] + dp[i - 2];
            }
            return dp[n];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    70. 爬楼梯

    链接地址

    class Solution {
    public:
        int climbStairs(int n) {
            if (n <= 1) return n;
            vector<int> dp(n + 1);
            dp[1] = 1;
            dp[2] = 2;
            for (int i = 3; i < n + 1; i++) {
                dp[i] = dp[i -1] + dp[i - 2];
            }
    
            return dp[n];
    
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    746. 使用最小花费爬楼梯

    链接地址

    class Solution {
    public:
        int climbStairs(int n) {
            if (n <= 1) return n;
            vector<int> dp(n + 1);
            dp[1] = 1;
            dp[2] = 2;
            for (int i = 3; i < n + 1; i++) {
                dp[i] = dp[i -1] + dp[i - 2];
            }
    
            return dp[n];
    
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    附加复习二分题:

    34. 在排序数组中查找元素的第一个和最后一个位置

    代码思路:使用二分查找法,找到目标值的位置,然后左右扩散去寻找元素的左右边界。

    class Solution {
    public:
        vector<int> searchRange(vector<int>& nums, int target) {
            int leftResult = -1;
            int rightResult = -1;
            vector<int> result;
            int left = 0;
            int right = (nums.size() - 1);
            while (left <= right) {
                int mid = left + (right - left) / 2;     
                if (nums[mid] > target) {
                    right = mid - 1;
                } else if (nums[mid] < target) {
                    left = mid + 1;
                } else {
                    int flag = mid;
                    while (flag >= 0 && nums[flag] == target) {
                        flag--;
                    }
                    leftResult = flag + 1;
                    while (mid < nums.size() && nums[mid] == target) {
                        mid++;
                    }
                    rightResult = mid - 1;
                    break;
                }
            }
       
            result.push_back(leftResult);
            result.push_back(rightResult);
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    Java学习笔记(二)——变量
    centos设置允许访问的ip
    frp实现内网穿透
    一篇文告诉你,当贝超短焦激光投影U1研发“内幕”
    HTML期末作业-基于HTML+CSS+JavaScript制作学生信息管理系统模板
    cargo介绍
    oracle实现搜索不区分大小写
    MFC知识点
    207.课程表 | 210.课程表II
    Android 自定义View(一):View是什么?如何创建自定义view,自定义属性等
  • 原文地址:https://blog.csdn.net/weixin_44378497/article/details/132819295