leetcode腾讯50题62-70-78

62. 不同路径

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

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

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

分析:状态转移方程:,

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

class Solution {

public:

    int uniquePaths(int m, int n) {

        vector> res(m);

        for(int i=0;i

        res[i].resize(n);

        for(int i=0;i

        {

            if(i

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

            for(int j=i+1;j

            {

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

            }

            for(int j=i+1;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是一个正整数。

分析:状态转移方程:

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 temp;

    vector> ans;

    vector> subsets(vector& nums) {

        ans.push_back({});

        dfs(0,nums);

        return ans;   

    }

        void dfs(int st, vector& nums) {

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

            return;

        }

        for(int i=st;i

        {

            temp.push_back(nums[i]);

            ans.push_back(temp);

            dfs(i+1,nums);

            temp.pop_back();

        }

    }

};

你可能感兴趣的:(leetcode腾讯50题62-70-78)