/images/avatar.png

vllbc

字符串的排列

字符串的排列

题目:

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.])

交叉验证

import numpy as np
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
data = datasets.load_iris()
X = data.data
Y = data.target
k_scores = []
for k in range(1,31):
    model = KNeighborsClassifier(n_neighbors=k)
    #scores = cross_val_score(model,X,Y,cv=10,scoring="accuracy") # for classification
    loss = -cross_val_score(model,X,Y,cv=10,scoring="neg_mean_squared_error") # for regression
    k_scores.append(loss.mean())
plt.plot(range(1,31),k_scores)
plt.show()

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