[研究生冲刺][算法实习生]LeetCode刷题日记(Day9)【欢迎关注,一起努力!Cheers!】

本文分享了LeetCode刷题经验,重点介绍了剑指Offer系列题目中的数组中重复的数字及二维数组查找问题的高效解法,包括使用排序、hash映射和矩阵特性等技巧。

[研究生冲刺][算法实习生]LeetCode刷题日记(Day9)【欢迎关注,一起努力!Cheers!】

致歉——To Readers & Myself

最近开学,中间断了大半个月,真是对不起(其实是自己又有点懒惰了QAQ)。不过开学以来英语是真的已经学起来了,LLS还是很不错的一个英语口语软件(为防止打广告的嫌疑,这里用缩写代替啦,用过的朋友就知道是哪个APP啦)。从今天开始,为了后面的实习面试,重点会刷剑指Offer啥的了,有更好思路的小伙伴,或者有推荐题目的小伙伴请留言哦~。等再刷一段时间,说不定我还会冲个会员体验一下力扣家的模拟面试啥的(有小伙伴想给我众筹一个月力扣会员吗,嘻嘻)

剑指 Offer 03. 数组中重复的数字

思路:
直接调用排序算法,然后遍历一遍,如果相邻元素大小相等,则返回该元素即可。不过这题看起来简单,其实可以琢磨的地方有许多,如继续压缩时间复杂度等。此时我们可以通过hash来做一个映射。
算法的复杂度:
排序时间复杂度为 O(nlogn) ,遍历时间复杂度为 O(n) ,所以整个算法时间复杂度为 O(nlogn + n) = O(nlogn)
代码:

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        for(int i = 1; i < nums.size(); ++i)
        {
            if(nums[i - 1] == nums[i])
            {
                return nums[i];
            }
        }
        return 0;
    }
};

剑指 Offer 04. 二维数组中的查找

思路:
一个是直接暴力遍历二维数组,则时间复杂度为 O( n 2 n^2 n2) ,这里不提倡。因此用另一种方法来解决,即每次查看当前矩阵的右上角元素x,如果x = target,则返回true,若x > target,则删掉最右边的列,否则删掉最上面的行。
算法的复杂度:
此算法最多遍历行+列次,因此算法时间复杂度为O(m+n)
代码:

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if(matrix.size() == 0) return false;
        int n = matrix.size();
        int m = matrix[0].size();
        int i = 0, j = m - 1;
        for(int k = 0; k < m + n; ++k)
        {
            if(i >= n || j < 0)
                return false;
            if(matrix[i][j] == target)
                return true;
            else if(matrix[i][j] > target)
                --j;
            else ++i;
        }
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值