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;
}
};
这道题让求从一个字符串转变到另一个字符串需要的变换步骤,共有三种变换方式,插入一个字符,删除一个字符,和替换一个字符。根据以往的经验,对于字符串相关的题目十有八九都是用动态规划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];
}
};
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;
}
}
}
}