一、力扣算法题
1.颜色分类
给定一个包含红色、白色和蓝色、共
n
个元素的数组nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数
0
、1
和2
分别表示红色、白色和蓝色。必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例1:
输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
示例2:
输入:nums = [2,0,1] 输出:[0,1,2]
这题就是普通的排序题,直接使用冒泡排序法
void sortColors(int* nums, int numsSize) {
for (int i = 0; i < numsSize; i++) {
for (int j = 0; j < numsSize - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
}
2.搜索二维矩阵
给你一个满足下述两条属性的
m x n
整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数
target
,如果target
在矩阵中,返回true
;否则,返回false
。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 输出:true
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13 输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
第一种方法暴力法,直接遍历数组。
/*这题可以直接暴力求解,两层for循环遍历二维数组,符合target就返回true,但暴力法时间
复杂度较高,而且题目中给的递增条件根本没有用到*/
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
for (int i = 0; i < matrixSize; i++) {
for (int j = 0; j < *matrixColSize; j++) {
if (matrix[i][j] == target)
return true;
}
}
return false;
}
第二种方法二分法,这里的难点在于将mid的值转换成二维数组的下标, 设二维数组的下标为m,n,则m=mid/总列数,n=mid%总列数。因为总行数=方格的总数/总列数,因此不难知道我们想求的mid在二维数组中的行数m就等于mid/总列数,mid在二维数组中的列数n等于mid%总列数。然后在二分法中需要注意不要陷入死循环。
//二分法
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize,
int target) {
int left = 0;
int right = (*matrixColSize) * matrixSize - 1;
int mid = left + (right - left + 1) / 2;
while (left <= right) {
mid = left + (right - left + 1) / 2;
int row = mid / (*matrixColSize);
int col = mid % (*matrixColSize);
if (matrix[row][col] == target)
return true;
//注意left==right时要跳出循环,但要计算left==right时target的值
if (left >= right)
break;
if (matrix[row][col] < target)
left = mid;
else if (matrix[row][col] > target)
right = mid - 1;//防止陷入死循环
}
return false;
}