力扣刷题230628

数组理论

1、数组是存放在连续内存空间上的相同类型数据的集合。
2、数组可以方便的通过下标索引的方式获取到下标下对应的数据。
需要两点注意的是:

  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的
    3、C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
    4、 数组的元素是不能删的,只能覆盖。

704、二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

关键词:有序、无重复元素(有重复元素查找答案不唯一)
题目链接:力扣题目链接
视频讲题:代码随想录视频讲解
自己题目理解:二分查找相当于折半搜索比较,区分区间边界是左闭右闭还是左闭右开很重要。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right =0, len(nums)
        while left<right:   #左闭右开 用<
        #while left!=right:     #与left<right效果等价
            middle=left+(right-left)//2
            
            if nums[middle]>target:
                right=middle
            elif nums[middle]<target:
            #if nums[middle]<target:
                left=middle+1
            else:
                return middle
        return -1

#        left=0
#        right=len(nums)-1
#        while left<=right:     #左闭右闭  用<=
#            middle=left+(right-left)//2
#            if nums[middle]>target:
#                right=middle-1
#            elif nums[middle]<target:
#                left=middle+1
#            else:
#                return middle
#        return -1

******一开始,总是报错,结果发现返回的不是下标,而是target。。。

27、移除元素

给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

关键词:双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
题目链接:力扣题目链接
视频讲题:代码随想录视频讲解链接
自己题目理解:直接暴力求解,设置一个中间数组tmp,当遍历数组nums时,如果当前元素不等于val,则将当前元素添加到tmp中。结果做完发现题目不允许利用新数组,也就是要在现有nums上完成移除重复值的任务。。。

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
#        i,n=0,len(nums)
#        while i<n:   #遍历数组
#            if nums[i]==val:  #遇到val
#                for j in range(i+1,n):  #遍历后续的数
#                    nums[j-1]=nums[j]   #用后一个数覆盖前一个数
#                i=i-1  #覆盖后将遍历的变量再指向前一个数,
#                n=n-1  #往前覆盖元素,一次覆盖,数组长度减一
#            i=i+1  #往后遍历剩余元素
#        return n    #暴力题解

         #双指针解法
        fast=0   #原数组的下标   
        slow=0   #新数组的更新下标
        while fast<len(nums):
            if nums[fast]!=val:#当前值不等于val,
                nums[slow]=nums[fast]#这时候就将快指针指向的数放到新数组里
                slow+=1  #存完一个数,新数组的下标加1,用于存放后续的数
            fast+=1  #如果当前值等于val,进行下一次判断
        return slow  #由于慢指针下标一直在增大,遍历完整个数组时,slow此时正是len(数组长度)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值