首页 > 其他分享 >代码随想录刷题营day1|704.二分查找 34. 有序数组找首位末位 35.搜索插入的位置 27.移除元素

代码随想录刷题营day1|704.二分查找 34. 有序数组找首位末位 35.搜索插入的位置 27.移除元素

时间:2022-11-20 03:22:13浏览次数:47  
标签:二分 27 target nums int 复杂度 随想录 查找 移除

一、数组理论基础

  • 数组下标都是从0开始的
  • 数组内存空间的地址是连续的
  • 数组的元素是不能删的,只能覆盖

二、刷题

第一题 704.二分查找

题目链接:https://leetcode.com/problems/binary-search/

难度:easy

思路:

题干sorted ascending array ,再加上给一个target返回符合的索引,很显然是需要缩小查找范围——首选二分查找法

再看限制条件,nums长度,时间复杂度最多为O(n^2), 如果用二分查找时间复杂度是O(logn) 符合题目条件

代码:

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # sorted array - BS 目的:缩小查找范围
        # l, r
        l=0
        r=len(nums)
        while l<r:
            m = l + (r - l)//2
            if nums[m] == target:
                return m
            elif nums[m]>target:
                r = m
            else:
                l = m+1
        return -1
                

习惯写左闭右开的方法,l<r, 其中r是不可能被遍历到的位置。

时间复杂度:O(logn)

空间复杂度:O(1)

第二题 34.有序数组找首位末位

题目链接:https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/

难度:medium

思路:

non-decreasing order-BS,target

又要求O(log n) ----二分查找

这道题的难点在于:如何确定下边界和上边界,怎么缩小范围,初刷没做出来,看答案看懂的。

代码:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        #non-decreasing order-BS,target,lower bound & upper bound
        #O(log n) ---- 100% BS solution
     
        ''''while l<r:
            if nums[m]>target:
                r=m
            if nums[m]<target:
                l=m+1
            if nums[m]==target:
                l+=1
                r-=1
                #这道题的难点在于:如何确定下边界和上边界,怎么缩小范围
        return [-1,-1]'''
        def search(x):
            l, r = 0, len(nums)           
            while l < r:
                m = l+(r-l) // 2
                if nums[m] < x: #这里严格小于缩小范围会得到下边界,同理严格大于缩小范围的思路会得到上边界。很tricky的一个细节,要注意!
                    l = m+1
                else:
                    r = m                    
            return l
        
        l = search(target)
        r = search(target+1)-1
        
        if l <= r:
            return [l, r]
                
        return [-1, -1]
'''
[5,7,7,7,7,8,8,8,10] target=8
l=search(8)
r=search(9)-1
search(x)
l=0,5,
r=9,9,
m=4,7,
nums[m]=7<8
nums[m]=8
expect output[5,7]
'''

debug:  IndentationError: unexpected indent  缩进不对

时间复杂度:O(logn)

空间复杂度:O(1)

第三题 35.搜索插入位置

题目链接:https://leetcode.com/problems/search-insert-position/

难度:easy

思路:

sorted array+target需要缩小范围搜索,用二分查找

找下边界的题,都是一个套路模版,和34题几乎一样

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        l=0
        r=len(nums)
        while l<r:
            m=l+(r-l)//2
            if nums[m]<target:
                l=m+1else:
                r=m
        return l

时间复杂度:O(logn)

空间复杂度:O(1)

第四题 27.移除元素

题目链接:

https://leetcode.com/problems/remove-element/

难度:easy

思路:

要求对等于val的值被替换成其他的,剩下的不管。那就只用遍历一遍,等于va的都跳过,不等于的值才可以按顺序被替换进array,剩下的位置都是空

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        p=0
        for i in range(len(nums)):
            if nums[i]==val:
                continue
            nums[p]=nums[i]
            p+=1
        return p

时间复杂度:O(n)

空间复杂度:O(1)

 

总结:

今天刷了4道题,704,34,35都是BS,27很简单 算不上two pointers.

熟练掌握了二分查找寻找下边界的模版

学习时长2小时,效果还不错,再接再厉。

 

标签:二分,27,target,nums,int,复杂度,随想录,查找,移除
From: https://www.cnblogs.com/cassiehao/p/16907815.html

相关文章

  • 代码随想录第三十九天|动态规划
    今天是第三十九天,只有两道动态规划的题 62.不同路径 classSolution{publicintuniquePaths(intm,intn){int[][]path=newint[m][n];......
  • AtCoder Beginner Contest 278
    A-Shift(abc278a)题目大意给定一个有\(n\)个整数的数组\(a\),要求进行以下\(k\)次操作,输出操作后的数组。操作为:将第一个数去掉,在队尾加上一个\(0\)。解题思路模......
  • 代码随想录day4---LeetCode24. 两两交换链表中的节点&19.删除链表的倒数第N个节点&面
    LeetCode24.两两交换链表中的节点题目链接给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节......
  • AtCoder Beginner Contest 278
    咕咕咕。D-AllAssignPointAdd把数拆分成\(base+delta\)。\(base\)就是操作一设置的数,初始时认为\(base=0\);\(delta\)的维护可以有两种方法。一种是我比......
  • 代码随想录算法训练营Day04|24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结
    代码随想录算法训练营Day04|24.两两交换链表中的节点、19.删除链表的倒数第N个结点、02.07.链表相交、142.环形链表II24.两两交换链表中的节点题目链接:24.两两交......
  • AtCoder Beginner Contest 278-D
    D-AllAssignPointAdd 题目链接:https://atcoder.jp/contests/abc278/tasks/abc278_d刚开始的思路是进行操作1的时候,将整个数组都赋成......
  • ABC274
    BattingAverageLineSensorAmedaRobotArms2BoosterFishingSecurityCamera3XORSumofArrays......
  • AtCoder Beginner Contest 278题解
    A-Shift题意给一个长度为\(n\)的数组,有\(k\)次操作,每次操作会将数组最前面的元素删掉,再在数组最后面加上一个0元素,问\(k\)次操作后的数组中的数字。思路看\(n\)与\(k......
  • AtCoder Beginner Contest 277 A~C
    本文同步发表于洛谷A.https://www.luogu.com.cn/blog/Alex-ZJY/solution-at-abc277-aB.https://www.luogu.com.cn/blog/Alex-ZJY/solution-at-abc277-bC.https://www......
  • 2713. 重复覆盖问题
    题目链接2713.重复覆盖问题给定一个\(N\timesM\)的数字矩阵\(A\),矩阵中的元素\(A_{i,j}\in\{0,1\}\)。请你在矩阵中找到一个行的集合,使得这些行中,每一列都包含......