提示:梦开始的地方~
目录
前言
提示:语言上利他 行为上利他
本系列《绝境求生》记录转码算法筑基过程,以代码随想录为纲学习,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的增长趋势)
编辑
贵有恒何必三更眠五更起,最无益只怕一日曝十日寒