打卡刷题(第1天)

 一、力扣算法题

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;
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值