leetcode_day1_筑基期_《绝境求生》

22 阅读4分钟

提示:梦开始的地方~

目录

前言

一、1两数之和

1.模型

二、二分查找祖师爷

1.模型

三、27原地移除元素

1.模型


前言

提示:语言上利他 行为上利他

本系列《绝境求生》记录转码算法筑基过程,以代码随想录为纲学习,leetcode_hot_100练手,在此记录思考过程,方便过后复现。内容比较粗糙仅便于笔者厘清思路,复盘总结。


提示:以下是本篇文章正文内容

一、1两数之和

示例,nums = [2, 7, 11, 15], target = 9,所以返回 [0, 1]
数组,元素是整数,找到任意两个数相加和为目标值,返回这两个数的下标

1.模型

暴力法
一层固定元素,一层找后面的元素,然后判断相加是否为目标值 
边界条件是数组长度

def Sum(self, nums: List[int], target: int) -> List[int]:
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i,j]

字典法
target肯定比这两个数大,固定一个数value,另一个数用target-value表示
细节是d[键]=值,这里我们用d[value]=index
先遍历数组得到每个元素的index和value,存放到字典中 即构造一个字典,遍历字典的key每个数value(key),看target-value是否在同一个字典中,如果是就返回他们下标

​编辑

二、二分查找祖师爷

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4     

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2     
输出: -1        
解释: 2 不存在 nums 中因此返回 -1        

1.模型

双指针法相向型
边界处理,左闭右闭
Mid=right-1 还是mid=right
细节mid=left+(right-left)//2, 如果用 right-left, 那left动了这么处理就是刻舟求剑了
,有一个标志位判断找到没有return False if not found else True
,找到退出break

​编辑

``

三、27原地移除元素

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

1.模型

暴力法        
第一个循环遍历数组,一旦找到目标值,再用一个循环把后面的元素全部前移,用长度L记录剩下的有用的元素的长度
注意两个循环的边界条件L肯定是会缩减的,因为目标值被覆盖推移到后面后我们就不需要再遍历它们了,即寻找的区间L是越变越小的,因为要移除的目标不用再前移。
(补充:数组的地址是连续的,二维数组的地址在空间上也是连续的。所以地址只能被覆盖不会消失)

​编辑

双指针法 快慢型
思想还是前移思想,暴力法是暴力覆盖,这里我们快指针主动去找不移除的元素去覆盖慢指针的位置,这样找完所有不移除的,要移除的自然而然就被推移到数组的最后,这时慢指针长度就是要返回的长度。这个方法是最快的。

​编辑


知识点

复杂度(基本操作随着输入规模n的增长趋势)

​编辑

贵有恒何必三更眠五更起,最无益只怕一日曝十日寒