【LeetCode】 1200. 最小绝对差

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 2 <= arr.length <= 10^5
    • -10^6 <= arr[i] <= 10^6

二、思路分析:

本题是一道简单题(简单题,我们要冲拳出击哈哈),读取题意要求求出数组中绝对值差最小的数对。在动手实现前,我们需要继续对题目中的细节进行明确几点信息:

  • arr 是由整数组成的整数数组,且其元素都没有重复的
  • arr 中找出绝对差最小的元素对
  • ans 以嵌套列表,按升序顺序排列

因此解答该题目,我们可以借助列表,模拟方法来求解,思路大致如下:

  • 定义ans的空列表,来存储绝对值最小的元素对;minabs 赋值一个足够大的数,2*10**6
  • 因为arr是一个无序整数数列,且要求最小的绝对值差值,因此在遍历前对arr进行升序排序
  • 因为要求最小的绝对值差,因此结果只能出现相邻两个元素之间(PS:需要转一转脑袋,否则的话会遍历使用两个for循环,会34/37case报时间超时) image.png
  • 使用for循环,进行遍历升序的arr列表,arr[i]和 arr[i+1] 两个绝对值差tmp
  • 当tmp小于minabs时,则确保ans清空,minabs赋值为tmp,ans添加新的元素对
  • 当tmp等于minabs时,则ans列表继续添加新的元素对

我们根据上述思路,使用Python可以轻松的实现出来,代码如下:

class Solution(object):
    def minimumAbsDifference(self, arr):
        """
        :type arr: List[int]
        :rtype: List[List[int]]
        """
        ans = []
        arr.sort()
        minabs = 2*10**6
        for i in range(len(arr)-1):
            tmp = abs(arr[i]- arr[i+1])
            if tmp < minabs:
                minabs = tmp
                ans = []
                ans.append([arr[i],arr[i+1]])
            elif tmp == minabs:
                ans.append([arr[i],arr[i+1]])
        return ans

三、总结:

本题考察对题目规则读取arr列表是不存在重复元素,要求绝对值差最小,则对arr进行升序排序后,只用遍历一遍数组就可以求出答案,本题AC提交记录如下:

image.png

  • 时间复杂度O(nlogn).n为arr数组长度,遍历数组时间为O(nlogn)
  • 空间复杂度O(logn).arr数组排序需要额外空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~

猜你喜欢

转载自juejin.im/post/7125421831200178189