目录
sort-colors(二分法,中等)
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
思路
整个分三种情况,等于1,小于1,大于1。套用二分法。如果当前值比1小,就把这个值和序列的第一个值替换,然后,下一个继续遍历,如果,发现有一个值小于1了,那么和序列的第二个值替换,就这样一直替换。同理比一大的也这么操作。直到,小于1的都在前面,大于一的都在后面,等于一的都在中间。
完整code
class Solution {
public:
void sortColors(int A[], int n) {
int ii = 0, jj = n-1, temp = 0;
for (int i = 0; i <= jj; i++)
{
if (A[i] < 1)
{
temp = A[ii];
A[ii] = A[i];
A[i] = temp;
ii++;
}
if (A[i] > 1)
{
temp = A[jj];
A[jj] = A[i];
A[i] = temp;
jj--;
i = i - 1;
}
}
}
};
search-a-2d-matrix(二维矩阵,中等)
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
每行的元素从左到右升序排列。每列的元素从上到下升序排列。
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
思路
剑指offer上也出现过,因为这个矩阵本身就有规律,右衡大于左,下衡大于上。所以,从右上角开始逐个比较,向下或左边移动,就可以了。
完整code
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
if (matrix.size() == 0 || matrix[0].size() == 0)
return false;
int m = 0, n = matrix[0].size() - 1;
while (m>=0 && m < matrix.size() && n >= 0 && n < matrix[0].size())
{
if (target > matrix[m][n])
m++;
else if (target < matrix[m][n])
n--;
else
return true;
}
return false;
}
};
plus-one(进位,简单)
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
思路
相当于模拟进位,设置一个进位符号,来存放进位值,同时,要处理,当最末端出现进位了,易位着要添加一位。
完整code
class Solution {
public:
vector<int> plusOne(vector<int> &digits) {
int carry = 1;
for (int i = digits.size() - 1; i >= 0; i--)
{
digits[i] += carry;
carry = digits[i] / 10;
digits[i] = digits[i] % 10;
}
if (carry > 0)
{
digits.insert(digits.begin(), 1);
}
return digits;
}
};
spiral-matrix-ii(二维矩阵,中等)
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路
做旋转矩阵的填入,其实是针对于矩阵特定位置元素的平移,分成四种情况考虑:上行,右列,下行,左列。
下面的每个for针对一种情况。这里注意for循环里面的边界条件。
完整code
class Solution {
public:
vector<vector<int> > generateMatrix(int n) {
vector<vector <int>> res(n, vector<int> (n));
if (n == 0) return res;
int step = 1;
int left = 0, right = n - 1, top = 0, bottom = n - 1;
while (left <= right && top <= bottom)
{
for (int i = left; i <= right; i++)
{
res[top][i] = step;
step++;
}
for (int i = top+1; i <= bottom; i++)
{
res[i][right] = step;
step++;
}
for (int i = right-1; i >= left; i--)
{
res[bottom][i] = step;
step++;
}
for (int i = bottom-1; i > top; i--)
{
res[i][left] = step;
step++;
}
right--; left++; top++; bottom--;
}
return res;
}
};
rotate-image(二维矩阵,中等)
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路
跟上一题一样,对四个特定方向的值进行有规律的替换就行了,设置一个temp,将最开始的值存进去,然后,开始变变换,把对应的值放到初始值位置,再一次更改,最后,把初始值填到最后的位置,就可以了。
完整code
class Solution {
public:
void rotate(vector<vector<int> > &matrix) {
int n = matrix.size();
for (int i = 0; i < n / 2; i++)
{
for (int j = i; j < n-i-1; j++)
{
int temp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
matrix[j][n - 1 - i] = temp;
}
}
}
};