LeetCode C++刷题 69-72题题解

69、x的平方根

题目:

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2
示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

二分

完整代码:

class Solution {
public:
    int mySqrt(int x) {
        int l = 0;
        int r = x;
        while(l <= x){
            long mid = (l + r) / 2;
            long temp = mid * mid;
            if(temp == x){
                return mid;
            }else if(temp > x)
            {
                if(mid - 1 >= l && (mid - 1) * (mid - 1) <= x)
                {
                    return mid - 1;
                }
                r = mid - 1;
            }else if(temp < x){
                if(mid + 1 <= r && (mid + 1) * (mid + 1) > x)
                {
                    return mid;
                }
                l = mid + 1;
            }
        }
        return 0;
    }
};

70、爬楼梯

题目:

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

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

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

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

动态规划

完整代码:

class Solution {
public:
    int climbStairs(int n) {
        //动态规划
        vector dp(n + 1);
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i < n + 1; i ++){
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

71、最大子序和

题目:

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。

 

示例 1:

输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
示例 2:

输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。
示例 3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:

输入:"/a/./b/../../c/"
输出:"/c"
示例 5:

输入:"/a/../../b/../c//.//"
输出:"/c"
示例 6:

输入:"/a//bc/d//././/.."
输出:"/a/b/c"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/simplify-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

栈(根据后序表达式求值的思想)

完整代码:

class Solution {
public:
    string simplifyPath(string path) {
        //栈的思想
        //不存"/"
        vector arr;
        string temp = "";
        for(int i = 0; i < path.size(); i++) {
            if(path[i] == '/') {
                if(temp == "" || temp == ".") {
                    temp = "";
                    continue;
                } else if(temp == "..") {
                    if(arr.size() > 0) {
                        arr.pop_back();
                    }
                } else {
                    arr.push_back(temp);
                }
                temp = "";  // 将temp置为空
            } else {
                temp += path[i];
            }
        }

        //处理最后一个
         if(temp == "" || temp == ".") {
                   
        }
        else if(temp == "..") {
            if(arr.size() > 0) {
                arr.pop_back();
            }
        } else {
            arr.push_back(temp);
        }

        string result = "";
        for(int i = 0; i < arr.size(); i++) {
            result += "/" + arr[i];
        }

        return result == "" ? "/" : result;
    }
};

72、编辑距离

题目:

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符
 

示例 1:

输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/edit-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

动态规划

完整代码:

class Solution {
public:
    int minDistance(string word1, string word2) {
        int n = word1.size();
        int m = word2.size();
        vector> dp(n + 1, vector(m + 1, 0));

        //需要全部删除,因此等于dp[i][0] = i
        for(int i = 1; i <= n; i ++) {
            dp[i][0] = i;
        }

        //需要全部删除,因此等于dp[0][i] = i
        for(int i = 1; i <= m; i ++) {
            dp[0][i] = i;
        }

        for(int i = 1; i <= n; i ++) {
            for(int j = 1; j <= m; j ++) {
                //加入word1和word2的当前值相等
                if(word1[i - 1] ==  word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    //不相等的情况下,可以进行删除、插入、替换,使得当前值相等
                    dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]) , dp[i - 1][j - 1]) + 1;
                }
            }
        }

        return dp[n][m];
    }
};

 

你可能感兴趣的:(LeetCode,C++刷题)