leetcode腾讯50题62-70-78

62. 不同路径

一个机器人位于一个m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

分析:状态转移方程:f(m,n)=f(m-1,n)+f(m,n-1),f(2,1)=1,f(1,2)=1

维护一个二维数组,逐步计算;

class Solution {

public:

    int uniquePaths(int m, int n) {

        vector<vector<int>> res(m);

        for(int i=0;i<m;i++)

        res[i].resize(n);

        for(int i=0;i<m;i++)

        {

            if(i<n)

            res[i][i]=(i>0)?(res[i-1][i]+res[i][i-1]):1;

            for(int j=i+1;j<n;j++)

            {

                res[i][j]=res[i][j-1]+((i>0)?res[i-1][j]:0);

            }

            for(int j=i+1;j<m&&i<n;j++)

            {

                res[j][i]=res[j-1][i]+((i>0)?res[j][i-1]:0);

            }

        }

        return res[m-1][n-1];

    }

};

70. 爬楼梯

假设你正在爬楼梯。需要n阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定n是一个正整数。

分析:状态转移方程:f(n)=f(n-2)+f(n-1)f(1)=1;f(2)=2;

class Solution {

public:

    int climbStairs(int n) {

        if(n==1)return 1;

        if(n==2) return 2;

        int pre=1;

        int mid=2;

        int next;

        for(int i=3;i<=n;i++)

        {

            next=pre+mid;

            pre=mid;

            mid=next;

        }

        return next;

    }

};

78. 子集

给你一个整数数组nums,返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。

class Solution {

public:

    vector<int> temp;

    vector<vector<int>> ans;

    vector<vector<int>> subsets(vector<int>& nums) {

        ans.push_back({});

        dfs(0,nums);

        return ans;   

    }

        void dfs(int st, vector<int>& nums) {

        if (st == nums.size()) {

            return;

        }

        for(int i=st;i<nums.size();i++)

        {

            temp.push_back(nums[i]);

            ans.push_back(temp);

            dfs(i+1,nums);

            temp.pop_back();

        }

    }

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容