zoukankan      html  css  js  c++  java
  • 287.寻找重复数 二分法 双指针

      https://leetcode-cn.com/problems/find-the-duplicate-number/

    简单思路:

      1. return sum( nums ) - n*(n+1)/2

      2. set()  if num in set: return num              用set 

      3. nums.sort()  if nums[i] == nums[i+1] : return nums[ i ]              排序后 相同的数相邻

    本题思路:

      1. 由于不能使用外部空间,并且时间复杂度< n^2,自然想到 nlogn, 就是二分法

      2. 双指针 快慢指针法,没看懂,放弃了 - -  

    二分法注意点:

      1. 边界选取用中值左边界。   mid = low + (high - low)//2    

        而不是  mid = (low + high+1)//2

      2. 想清楚数数的两个判断条件

        1) 判断nums[i] 与 mid的关系时 是小于等于:   if nums[ i ] <= mid : count +=1。

        2) 这意味着统计了包括中值以下的所有数,如果重复数在里面 则必有  count > mid 。  比如 0-7中,mid = 4 ; count = 5; 此时移动上界为4,在0-4中找

          if count > mid:  high = mid

          else: low = mid + 1

             否则在 5-7中找重复的数

      3. 最后返回左值,我还没想清楚

    代码:

    class Solution:
        def findDuplicate(self, nums: List[int]) -> int:
            # 取左界 6取3 7取4  如果在左边,则有 4>3(6) 5>4(7) 若在右边,则左边等式有 3 >3(6) 4>4 (7)
            l = 0
            r = len(nums)-1
            while l<r:
                count = 0
                mid = l + (r-l)//2   # 这是取值范围的中值,不是list的中值
                for num in nums:
                    if num <= mid:
                        count +=1
                if count > mid:
                    r = mid 
                else:
                    l = mid+1 
                print(l,r)
            return l
            
  • 相关阅读:
    Quartz.net官方开发指南 第十一课: 高级(企业级)属性
    .NET开源项目:Tomboy
    开源的作业调度框架 Quartz.NET
    DinnerNow.net: 微软最新技术集成示例
    将Quartz.NET集成到 Castle中
    评论:微软的SOA战略
    行为驱动开发Behaviour Driven Development
    Mono 1.2.5 发布,提供对IronPython和DLR的支持
    Quartz.net官方开发指南 第二课:Jobs And Triggers
    数据库厂商提供的 Providers for ASP.NET
  • 原文地址:https://www.cnblogs.com/ChevisZhang/p/12845712.html
Copyright © 2011-2022 走看看