/images/avatar.png

vllbc

长度最小的子数组

长度最小的子数组

题目:

https://leetcode-cn.com/problems/minimum-size-subarray-sum/

思路:

​ 一开始想的是直接排序,然后从后面开始遍历,因为要求最小的

然后出错了,,,,,

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        nums.sort()
        end = len(nums) - 1
        while end > 0:
            for i in range(end,-1,-1):
                if sum(nums[i:end+1]) >= s:
                    return len(nums[i:end+1])
            end -= 1
        return 0

213

[12,28,83,4,25,26,25,2,25,25,25,12]

出了错,结果试了一下排序后的列表

字符串的排列

字符串的排列

题目:

https://leetcode-cn.com/problems/permutation-in-string/

思路:

滑动窗口加字典

代码:

class Solution(object):
    def checkInclusion(self, s1, s2):
        counter1 = collections.Counter(s1)
        N = len(s2)
        left = 0
        right = len(s1) - 1
        counter2 = collections.Counter(s2[0:right])
        while right < N:
            counter2[s2[right]] += 1
            if counter1 == counter2:
                return True
            counter2[s2[left]] -= 1
            if counter2[s2[left]] == 0:
                del counter2[s2[left]]
            left += 1
            right += 1
        return False

apply_along_axis

类似于pandas的apply,就是在某一维上进行定义的函数操作

apply_along_axis(func1d, axis, arr, *args, **kwargs)

官网的例子

def my_func(a):
    return (a[0] + a[-1]) * 0.5
b = np.array([[1,2,3], [4,5,6], [7,8,9]])

np.apply_along_axis(my_func, 0, b)
# 结果
array([ 4.,  5.,  6.])

# 结果

array([ 2.,  5.,  8.])

B树

B树

B树就是B-树,以前还以为这是两种树,现在才知道这俩就是一个东西。

基本概念

  1. 所有的叶子结点都出现在同一层上,并且不带信息(可以看做是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
  2. 每个结点包含的关键字个数有上界和下界。用一个被称为 B-树的 最小度数 的固定整数 t≥2 来表示这些界 ,其中 t 取决于磁盘块的大小:
    a.除根结点以外的每个结点必须至少有 t−1 个关键字。因此,除了根结点以外的每个内部结点有 t 个孩子。如果树非空,根结点至少有一个关键字。
    1. 每个结点至多包含 2t−1 个关键字。
  3. 一个包含x个关键字的结点有x+1个孩子。
  4. 一个结点中所有的关键字升序排列,两个关键字\(k_1\)\(k_2\)之间的孩子结点的所有关键字key在\((k_1, k_2)\)的范围内。

其中最小度数和B树的阶不一样:

和为s的连续正数序列

和为s的连续正数序列

题目:

https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/

思路:

滑动窗口即可,滑动窗口就是选取数组的一部分来进行操作,left 和 right只能向右移动

代码:

class Solution:
    def findContinuousSequence(self, target: int) -> List[List[int]]:
        res = []
        left,right = 1,2
        while left <= target // 2: # 优化 减少时间复杂度
            if sum(range(left,right+1)) < target: # 小于target 右指针移动
                right += 1
            elif sum(range(left,right+1)) > target: # 大于target 左指针移动
                left += 1
            else:
                res.append(list(range(left,right+1))) # 相等的话 两个指针都移动
                right += 1
                left += 1
        return res