IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 挑战坚持每天写算法题一个月!!! -> 正文阅读

[数据结构与算法]挑战坚持每天写算法题一个月!!!

目录

前言

?2021-10-8

题目

合并两个有序数组

解题思路

代码

其他思路

2021-10-9

题目

数组中的重复数字

二维数组中的查找

解题思路

数组中的重复数字

二维数组中的查找

代码

总结:



前言

因为最近参加了csdn的一个大博主的活动第一届LeetCode刷题打卡赢现金活动,坚持每天写写力扣算法题一个月,我觉得这个活动很有意义,因为每天能写一道算法题很容易,但是坚持一周呢?一个月呢?一年呢?能坚持的人少之又少,但是如果坚持每天写几道算法题并坚持很久,也是会有很大的收获的,为了自己的目标,我们冲就完事!!!

顺便给大佬谢谢这个大佬提供这个机会!!

大家也可以去大佬的博客看看干货!!!

向大佬学习!!

?2021-10-8

题目

合并两个有序数组

给你两个按 非递减顺序 排列的整数数组?nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例一:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例二:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例三:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

解题思路

首先我们得把两个数组按照指定切片,并且不能创建新的内存。

nums1 [:] = nums1[:m]
nums2 [:] = nums2[:n]

然后我们在把这两个数组给加到nums1这个数组中!!

nums1[:] = nums1 +nums2

然后我们就可以用随便一种排序算法将这个数组排序,我就演示冒泡排序了。

代码

class Solution:
    def merge(self, nums1, m: int, nums2, n: int) -> None:


        nums1[:] = nums1[:m]
        nums2[:] = nums2[:n]
        nums1[:] = nums1 + nums2
        length = len(nums1)
        for i in range(length - 1):  # 共有length -1趟排序
            flag = True  # falg用于记录一趟冒泡排序中,是否有逆序发生
            for j in range(1, length - i):
                if nums1[j - 1] > nums1[j]:
                    flag = False  # 有逆序发生
                    nums1[j - 1], nums1[j] = nums1[j], nums1[j - 1]
            if flag == True:
                break


        return nums1

其他思路

其实排序这个算法是O(n)了效率不是很高,如果用双指针就能提高很多的效率复杂度就变成O(m+n),我先说我写这个题的过程,我一共用了三个思路,前两个都有问题,我直接裂开了,从6.00写到10.00,真是一杯茶,一支烟,一道力扣写一天。我的第一个思路是创建一个新的内存,我但是没有看清题意然后就直接创建一个新的地址,然后就提交的时候发现pycharm和力扣的结果总是不一样,我都怀疑力扣出问题了,然后我才知道我不能创建新的地址,所以我手写了第二种思路,但是我又犯了一个致命的错误,就是每次添加数组的长度会改变,然后这个没办法判断下标,其实这个可以从右向坐移动指针,来很有效的解决这个问题,这个问题还是我现在在写这个博客的时候,去大佬群里一个大佬给了我提醒,我真的是菜的垃圾呀,一个初级算法我能写好几个小时,所以这次更要加油了!!

接下来我给大家看一下我写的第二个思路的手稿!!!

?

?

?今天虽然就写了一题,但是我觉得我进步还是非常大的,如果每天坚持下去,我相信我能收获更多!!!

2021-10-9

题目

数组中的重复数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例一:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。?

示例一:

[
? [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]
]

给定 target?=?5,返回?true

给定?target?=?20,返回?false

解题思路

数组中的重复数字

这个算是一个超级简单的算法题,但是我写这个题简直了呀,开始不想用暴力解法,然后写了半小时,发现越来学懵逼,然后最后用暴力解法,但是!!!!暴力解法超时就很难受!!!

所以我就看了官方的一个题解,我看完以后就是真的很简单,我简直服了我这个智商,是用python间的几行代码就能完成的事我写了半个小时,哭了呀家人!!

话不多说直接上题解:

我们首先可以创建一个set集合,因为集合是不能重复的,所以我们在对列表nums进行一个循环,判断nums元素是否在set中,如果不在就添加,如果在了就表明这个元素是列表中重复的元素,我们就可以直接返回。

总体来说这个题很简单,并不是很难的一个题,还是得多练。

二维数组中的查找

这个题在python中其实能卡一个bug----用 in 一下子就出来了,时间复杂度也是n。

但是我们刷算法的目的是什么?就是为了最优的解决这个问题,让它的效率最大化!!

所以我们不应该取巧的。

这个题主要的思路就是以右上角开始,如果目标变量比右上角的数小,就向左移一列,如果目标标量比右上角的数大就下一移动到下一行的数组中,由此来判断,最后是否能够在这个二维数组里面找到这个目标变量!

两者的复杂度:

?

接下来我就给大家把这这两个的代码都放在上面!!

代码

合并两个有序数组

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        dict = set()
        for num in nums:
            if num in dict:
                return num
            else:dict.add(num)

二维数组的查找

一:

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        for i in matrix:
            if target in i:
                return True
        else:
            return False

二:

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if len(matrix) == 0 :
            return False
        l_len = len(matrix)
        h_len = len(matrix[0])
        l = 0
        h = h_len-1
        while l<l_len and h>=0:
            if target<matrix[l][h]:
                h -=1
            elif target>matrix[l][h]:
                l += 1
            else:
                return True
        else:
            return False

总结:

2021-10-9.

总结今天的成果,目前是上午一道下午一道,感觉今天在写这两题的时候收获很多,尤其查找二维数组的这个新思路,我觉得很让我有一个新的思路,可能这就是刷算法题的魅力吧,感觉越刷越上瘾,而且我还比较喜欢在本子上先把思路写一遍然后在整理到 lc 上面我觉得每天刷力扣题也好,每天写一个博客也好,慢慢养成的话,我会觉得这是一个好习惯,对以后的工作啥的帮助肯定会很大,所以只要一有时间我就来刷题,卷起来就完事!!!

给大家分享一下我的笔记,虽然有点丑哈哈哈哈。

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:31:37  更:2021-10-09 16:33:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:39:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码