力扣刷题 day26:09-25

1.字符串的排列

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。力扣刷题 day26:09-25_第1张图片

方法一:数组加滑动窗口 

#方法一:数组加滑动窗口
def checkInclusion(s1,s2):
    n,m=len(s1),len(s2)
    ds1=[0 for i in range(26)]
    ds2=[0 for i in range(26)]
    if n>m:
        return False  #特殊情况判断
    for i in range(n):
        ds1[ord(s1[i])-ord('a')]+=1
        ds2[ord(s2[i])-ord('a')]+=1  #只包含小写字母
    if ds1==ds2:
        return True
    for i in range(n,m):
        ds2[ord(s2[i])-ord('a')]+=1    #移动窗口
        ds2[ord(s2[i-n])-ord('a')]-=1
        if ds1==ds2:
            return True
    return False

2.找到 K 个最接近的元素

给定一个 排序好 的数组 arr ,两个整数 k 和 x ,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。

整数 a 比整数 b 更接近 x 需要满足:

|a - x| < |b - x| 或者
|a - x| == |b - x| 且 a < b力扣刷题 day26:09-25_第2张图片

方法一:二分+双指针 

#方法一:二分+双指针
def findClosestElements(arr,k,x):
    left=0
    right = len(arr)-1
    while left=x:
            right=mid   #找到最接近x的位置下标
    l=left-1
    r=left
    while k>0:
        if l<0:
            r+=1   #左边界,那么只能右指针移动
        elif r>=len(arr):  #右边界,只能左指针移动
            l-=1
        elif x-arr[l]<=arr[r]-x:  #左指针移动
            l-=1
        elif x-arr[l]>arr[r]-x:
            r+=1
        k -= 1
    return arr[l+1:r]

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展)