leetcode(四)

1.sqrt 求开方

class Solution {public:
    int mySqrt(int x) {
        if (x <= 1) return x;
        int res;
        int left = 0, right = x/2;
        while (left <= right) {

            int mid = left + (right - left) / 2;
            
            if (x / mid > mid) 
            {
                left = mid + 1;
                res = mid;
            }
            else if (x / mid < mid) 
            {
                 right = mid - 1;
            }else
                return mid;               
        }
        return res;
    }
};

2.up bound 与 low bound

class Solution {public:
    int upbound(vector<int> a,int x) {
        int n = a.size() - 1;
        if (n < 1) return 0;
        int left = 0, right = n;
        while (left <= right) {

            int mid = left + (right - left) / 2;
            
            if (x > a[mid]) 
            {
                left = mid + 1;
            }
            else 
            {
                 right = mid;
           }        
        }
        return left;
    }
};
class Solution {public:
    int lowbound(vector<int> a,int x) {
        int n = a.size() - 1;
        if (n < 1) return 0;
        int left = 0, right = n;
        while (left <= right) {

            int mid = left + (right - left) / 2;
            
            if (x >=a[mid]) 
            {
                left = mid + 1;
            }
            else  
            {
                 right = mid;
           }        
        }
        return left;
    }
};

3.Edit Distance 编辑距离

这道题让求从一个字符串转变到另一个字符串需要的变换步骤,共有三种变换方式,插入一个字符,删除一个字符,和替换一个字符。根据以往的经验,对于字符串相关的题目十有八九都是用动态规划Dynamic Programming来解,这道题也不例外。这道题我们需要维护一个二维的数组dp,其中dp[i][j]表示从word1的前i个字符转换到word2的前j个字符所需要的步骤。那我们可以先给这个二维数组dp的第一行第一列赋值,这个很简单,因为第一行和第一列对应的总有一个字符串是空串,于是转换步骤完全是另一个字符串的长度。跟以往的DP题目类似,难点还是在于找出递推式,我们可以举个例子来看,比如word1是“bbc",word2是”abcd“,那么我们可以得到dp数组如下

  Ø a b c d

Ø 0 1 2 3 4

b 1 1 1 2 3

b 2 2 1 2 3

c 3 3 2 1 2

class Solution {public:
    int minDistance(string word1, string word2) {
        int n1 = word1.size(), n2 = word2.size();
        int dp[n1 + 1][n2 + 1];
        for (int i = 0; i <= n1; ++i) dp[i][0] = i;
        for (int i = 0; i <= n2; ++i) dp[0][i] = i;
        for (int i = 1; i <= n1; ++i) {
            for (int j = 1; j <= n2; ++j) {
                if (word1[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
                }
            }
        }
        return dp[n1][n2];
    }
};

4.Sort Colors 颜色排序

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

- 首先遍历一遍原数组,分别记录0,1,2的个数
- 然后更新原数组,按个数分别赋上0,1,2

class Solution {public:
    void sortColors(int A[], int n) {
        int count[3] = {0}, idx = 0;
        for (int i = 0; i < n; ++i) ++count[A[i]];
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < count[i]; ++j) {
                A[idx++] = i;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值