ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode-D40-数组-34. 在排序数组中查找元素的第一个和最后一个位置&36. 有效的数独

2022-02-02 12:02:45  阅读:124  来源: 互联网

标签:target nums curNum 36 int 取整 数组 D40 边界


一、复习

33、 搜索旋转排序数组
今天的思路顺利多了,就是还有一些小纰漏。刚开始判断的是mid落在哪个区间,是nums[mid]在和端点作比较,而不是target;在后来判断target区间的时候,要严格加上左右边界,不然不严谨。

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

二、34. 在排序数组中查找元素的第一个和最后一个位置

1、我肯定可以通过二分法找到这个数,但是不能确定找到的是第几个。那如果可以确定找到第一个或者最后一个,问题就简单了。
不会啊
2、复制一下
//求左边界:向下取整,等号归右,左加一
//求右边界:向上取整,等号归左,右减一
//总是右侧为所求
在这里插入图片描述

帅呆了,酷毙了,简直不可理喻了。

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
    #      //求左边界:向下取整,等号归右,左加一
    # //求右边界:向上取整,等号归左,右减一
    # //总是右侧为所求
        n = len(nums)
        if n==0:
            return [-1,-1]
        if n==1:
            if nums[0]==target:
                return [0,0]
            else:
                return [-1,-1]
        l=0
        r=n-1
        while(l<r):
            mid = (l+r)//2
            if target<=nums[mid]:
                r =mid
            else:
                l = mid+1
        if nums[r]== target:
            l_index = r
        else:
            l_index = -1
        
        l=0
        r=n-1
        while(l<r):
            mid=(l+r)//2+1
            if nums[mid]<=target:
                l = mid
            else:
                r = mid-1
        if nums[r]==target:
            r_index = r
        else:
            r_index= -1

        return [l_index,r_index]

在这里插入图片描述

3、背一下
求左边界:
向下取证,等号归右,左加1;
求右边界:
向上取等,等号归左,右减1;

最后取右

改良版:
求左边界:
向下取整;target在左,右得mid;左加1;
求右边界:
向上取整;target在右,左得mid;右减1;

【明天再写一遍】

三、36. 有效的数独

1、取出来,再排序,再判断相邻。做三次(三条规则),时间复杂度是O(n2)。看看有什么其他好的解法没有。
在这里插入图片描述

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        col = [[0]*10 for _ in range(9)]
        row = [[0]*10 for _ in range(9)]
        box = [[0]*10 for _ in range(9)]

        for i in range(9):
            for j in range(9):
                if board[i][j] =='.':
                    continue
                curNum = int(board[i][j])
                if col[j][curNum]!=0 or row[i][curNum]!=0 or box[(i//3)*3+j//3][curNum]!=0:
                    return False
                col[j][curNum],row[i][curNum],box[(i//3)*3+j//3][curNum]=1,1,1
        return True

大概写了一下,哈希表还是一个好东西:当某些需要判断是否出现或者记录出现次数的数或字母的数量固定的时候,可以记录这些东西是否出现过,或者出现的次数。
在这里插入图片描述

【明天复习的时候再看下之前做的哈希表的题】

标签:target,nums,curNum,36,int,取整,数组,D40,边界
来源: https://blog.csdn.net/weixin_45252975/article/details/122768176

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有