提克破事水


  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Search

343. 整数拆分

Posted on 2023-03-27 | In Leetcode题录 |

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/integer-break
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def integerBreak(self, n: int) -> int:
dp = [0 for i in range(n + 1)]
if len(dp) >= 3:
dp[1] = 0
dp[2] = 1
for index in range(3,n+1):
for i in range(1,index):
j = index - i
dp[index] = max(i * j, i* dp[j],dp[index])
return dp[n]

96. 不同的二叉搜索树

Posted on 2023-03-27 | In Leetcode题录 |

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution:
def numTrees(self, n: int) -> int:
#dp是什么?
#dp为 节点数为n时有多少种方案
dp = [0] * (n+1)
#dp如何初始化?
dp[0] = 0
dp[1] = 1
# dp[2] = 2
#如何推导?
#[1]
# 左子树为0,右子树为0
#[1,2]
# 1为头节点时, 左子树节点数为0,右子树节点数为1
# 2为头节点时,左子树节点数为1,右子树节点数为0
#[1,2,3]
# 1为头节点时,左子树节点数为0,右子树节点数为2
# 2为头节点时,左子树节点数为1,右子树节点数为1
# 3为头节点时,左子树节点数为2,右子树节点数为0
#[1,2,3,4]
# 1为头节点时,左子树节点数为0,右子树节点数为3
# 2为头节点时,左子树节点数为1,右子树节点数为2
# 3为头节点时,左子树节点数为2,右子树节点数为1
# 4为头节点时,左子树节点数为3,右子树节点数为0
#dp的推导顺序?
for index in range(2,n+1):
nums = 0
for i in range(1,index+1):
left = i - 1
right = index - i
nums += max(dp[left],1) * max(dp[right],1)
dp[index] = nums

#举例推导dp
return dp[n]

121.买卖股票的最佳时机

Posted on 2023-03-27 | In Leetcode题录 |

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1
2
3
4
5
6
7
class Solution:
def maxProfit(self, prices: List[int]) -> int:
min_price,max_profit = int(1e9), 0
for i in prices:
min_price = min(min_price,i)
max_profit = max(max_profit,i - min_price)
return max_profit

Git使用

Posted on 2023-03-24 | In 常用工具 |

什么是Git?

分布式版本控制工具

为什么要用Git?

因为需要版本控制,尤其多人协作开发的时候,用于版本回滚。
主流的版本控制器有:
SVN(Subversion)
CVS(Concurrent Versions System)
VSS(Micorosoft Visual SourceSafe)
TFS(Team Foundation Server)
Visual Studio Online
版本控制产品非常的多,影响力最大且使用最广泛的就是Git。

与SVN的区别?

SVN时集中版本控制工具,所有人在进行开发时都要在联网状态下从远程仓库中拉取最新代码才能进行开发,开发后还要上传到远程服务器。如果服务器损坏将无法继续工作。
Git是分布式版本控制工具,所有参与开发的人员手中都有完整的项目代码,内容变更时只需要将自己更新的内容推送给其他人即可。此外,开发过程中不依赖网络,服务器损毁对工作人员也无影响。

安装Git及环境配置

访问git官方网站下载适合自己硬件环境的安装包,无脑下一步即可。

Git的必要配置

1.配置用户名

1
git config --global user.name "你的名字"

2.配置邮箱

1
git config --global user.email "你的@邮箱.com"

工作原理

git中包含工作目录、暂存区、本地仓库和远程仓库4个工作区域。
工作区就是平时存放项目代码的路径;暂存区用于临时存放变更的内容,其本质是一个文件,保存即将提交到文件列表的信息;本地仓库是安全存放数据的位置,这里面有你提交的所有版本的数据。其中HEAD只想最新放入仓库的版本;远程仓库就是托管代码的服务器,简单理解就是github中后缀是“.git”的仓库。与使用者之间直接相关的只有工作目录和远程仓库,暂存区和本地仓库只涉及到一些命令操作。
在工作目录使用git add指令将变更内容推送至暂存区,暂存区的内容使用git commit推送至本地仓库,使用git push将本地仓库中的内容推送至远程仓库;反向操作时,使用git pull将远程仓库的内容回滚到本地仓库中,使用git reset将本地仓库的内容回滚到暂存区中,使用git checkout将暂存区中的内容回滚到工作目录中,上述命令的使用如下图所示。

Git项目创建及克隆

在工作路径中右键空白处,唤出git bash界面。
1.本地仓库搭建
在git bash界面中输入以下指令,初始化git项目。

1
git init

init结束后会在工作路径中生成一个隐藏的.git文件夹,表示当前工作路径已然是一个Git项目。git init后可以在将本地变动添加至暂存区和本地仓库。
2.配置远程仓库
init后如果需要将本地内容推送至服务器,需要使用git remote指令对远程服务器地址进行配置。

1
2
git remote add origin url
# 如git remote add origin ssh:/xxx.git

需要修改url时可以使用git remote set-url指令。

1
2
git remote set-url origin url
# 如git remote set-url origin ssh:/xxx.git

另外,remote指令还可以用来验证是否成功添加配置。

1
2
git remote -v
# 如git remote set-url origin ssh:/xxx.git

推荐姿势
使用init的方式创建项目后,还是需要在github中创建仓库之后再使用remote进行配置。不如先在github中创建库存然后使用gitclone的方式将库存下载到本地,省去一捏捏配置的步骤。
创建库存后制git链接,在工作路径中唤出git bash界面,使用git clone “.git链接”下载该项目的代码,复制git链接的方法如图所示。

1
git clone xxx.git

.gitignore文件的配置使用

使用git过程中,有些文件比如日志、临时文件、数据等通常不会被提交到代码仓库当中,这时就需要设置相应的忽略规则,避免不必要的文件上传到远程仓库当中,.gitignore文件就是用于设定工作路径中哪些文件不会被上传。在Github中创建库存时,勾选生成.gitignore文件选项即可生成该文件。clone到本地后可以对其进行修改配置,.gitignore文件的内容书写方式如下。

1
2
3
4
5
6
7
8
9
#不需要提交的目录
/folder name
#不需要提交的文件
_config.yml
.gitignore
#log 不需要提交任意后缀名为log的文件
*.log
#package Files 不需要提交的任意包含后缀名为jar的文件
*.jar

这里只对gitignore文件的基本用法进行介绍,详见[Git].gitignore文件的配置使用。

Git的基本操作命令

???Git中文件的4种状态

Git中,文件包含未跟踪(Untracked)、暂存状态(Staged)、未修改(Unmodify)和已修改(Modified)。下面用一个例子对这4种状态进行解释说明。
假设现在创建一个hello.py文件,该文件并未加入到git库中,不参与版本控制,所以处于“未跟踪状态”;使用git add . 指令将该文件存入暂存区后,则其状态为“暂存状态”;使用git commit指令将其推送至本地仓库后,暂存区为空,此时该文件所处状态为“未修改”。此时若对文件进行了修改,则其状态为“Modified”,使用add加入暂存区后,commit即可将其重新推送到本地仓库中。

暂存区

使用git add 指令可以将未跟踪文件和已修改文件添加至暂存区。

1
2
git add . # “.” 表示将当前路径所有内容都添加至暂存区
git add filename #将某文件单独添加至暂存区

如若想要撤回暂存区中的内容,可以使用git reset指令。
文件撤出暂存区,但保留修改:

1
git reset --mixed

撤销所有已经add的文件:

1
git reset HEAD .

撤销某个文件或文件夹

1
git reset HEAD  -filename

本地仓库

git commit指令可以将暂存区中的内容提交至本地仓库中,在使用commit指令时一定要附带-m参数,为当前commit添加注释信息。

1
git commit

版本控制

本地版本控制

集中版本控制

Git的特点

1.分布式版本管理工具
2.敏捷开发
3.开源

十八般武艺

git stash

用于临时保存修改的文件。修改文件时,需要临时切换到其他分支,但是还不想提交,可以用stash临时保存。

1
git stash save "xxx"

git log

包含两个参数“–oneline”和“–graph”可以帮助看到日志的流程?

1
git log --oneline --graph

git push

用于删除远程分支:

1
git push branch_name

git rm

如果错误commit,想去除掉文件,可以使用rm命令,可以将暂存区未commit的文件去除?

1
git rm --cached filename

git commit

提交commit但是不创建新的提交记录,再上一次log中更新内容,可以用来压缩日志

1
git commit --amend

git cherry-pick

提交特定一次修改

1
git cherry-pick commit-id

git archive

文件快照打包

1
git archive -o archive.zip master

代码冲突

解决代码冲突的常见两个方法

1
git merge master
1
git rebase -i master

远程仓库

如何将本地文件和远程仓库文件关联起来?
项目路径要保证是被git管理的路径,即“git init”,然后使用-v参数查看与哪些远程仓库有关联,然后使用add参数添加关联。
可以使用rm指令删除关联。

1
2
3
git remote -v   #查看当前路径与哪些远程仓库关联,没有则为空
git remote add origin git@github.com:xxxx.git
git remote rm origin

本地内容变更后,使用commit将内容推送至缓存区,想要推送到远程仓库时,需要用到push指令,-u用于指定上游分支

1
git push -u prigin master

?从远程仓库获取指定分支

1
git checkout -b local_branch_yy origin/remote_branch_yy

压缩提交记录

如果有多次提交记录,却只想保留一条记录怎么办?

reset

在当前commit中包含多个comit时,

1
2
3
git reset commit-id
git add filename
git commit -m "xxx"

amend

1
git commit --amend

rebase

1
2
3
git rebase -i commit-id
pick ef124f 保留
squash fa4f8d 压缩

标签

1
2
3
4
5
6
git tag tag_name
git tag tag_name commit-id
git tag -a tag_name -m "xxx" commit-id
git tag
git show tag_name
git push origin tag_name

使用经验

自己使用git的转变,这鬼东西好难学啊。

第一层

欸?这个项目好像不错欸,下下来康康!这时候git对我来说只是一个下载代码的地方,所用到的指令基本上也就是clone了。下载之后自己在本地跑一跑改一改,基本不设计到其他指令,甚至是直接下载压缩包。。不需要用指令。。

1
git clone something.git

第二层

以后我把我自己写的代码都存上云,谁想了解我我就丢他个github链接!这时候就是自己创建一个远程仓库,把自己更改过的代码上传到仓库当中,每次变动后只要add、commit、push就可以了。

1
2
3
4
cd workspace
git add .
git commit -m "something upload"
git push

第三层

跟一个小伙伴一起写代码~这个时候就需要开始接触分支了,各自在自己的分支上更新代码,两人同时编写一个文件时,上传的时候可能就要遇到冲突。所以在每次上传之前需要先从远程仓库将最新的内容pull下来,然后再把本地的变动推送到远程服务器。这时候就可以使用stash指令,暂时将本地的内容恢复到变动之前,从远程pull最新内容后使用stash pop指令恢复本地的改动,然后再进行add、commit、push上传自己的代码。

1
2
3
4
5
6
7
8
9
git clone something.git
git branch selfBranch
git checkout selfBranch
git stash
git pull origin selfBranch
git stash pop
git add .
git commit -m "something upload"
git push origin selfBranch

致谢

你什么档次?也配跟我用同一款Git

Hexo + Github page + Butterfly + Github Action搭建个人博客

Posted on 2023-03-23 | In 博客搭建 |

Hexo博客搭建
Hexo 博客利用 Github Action 自动化部署
利用 Github Actions 自动部署 Hexo 博客
hexo博客搭建从入门到入土完全优化系列
Github Pages+Hexo搭建博客

搭建流程

由于Github提供了免费的Page服务,所以就有了Hexo生成站点然后部署在Github Page上的玩法。博客的页面设计、部署等问题可以通过Hexo一键完成,作者只需要关注文章内容即可。本篇博文只对Windows操作系统的博客搭建过程进行记录,其他需求还请读者自行探索。搭建博客的整体思路是,首先使用Hexo一键生成博客站点,并使用butterfly对站点进行美化。然后,将站点部署到Github page上,即可通过访问[git_user_name].github.io来查看博客内容。接着,单独为博客内容创建一个仓库,使用Github Action监听内容仓库,如果内容仓库中有更新则重新将内容重新部署到博客当中。

Hexo

Hexo的安装方法可以直接参考Hexo官方文档,为保证博文结构完整性,将官方文档中的相应步骤抄录至本文中。

安装前提

在安装Hexo之前需要先安装下列应用程序:
Node.js (Node.js 版本需不低于 10.13,建议使用 Node.js 12.0 及以上版本)
Git
两者的安装过程中并无任何特殊配置,只需要点击“下一步”完成安装即可,读者可以根据自身喜好在安装过程中进行相应设置。安装完成后,可以在CMD中通过以下指定,测试是否安装成功。

1
2
3
$ node -v
$ npm -v
$ git -v

这里要记录一下node -v的结果,后续配置_config.yml时会使用到。
安装必备的应用程序后,需要创建一个空文件夹作为博客的项目路径,接下来我们将称这个创建好的文件夹为博客项目路径。进入博客项目路径,空白处点击右键,选择“Git Bash Here”,准备安装搭建博客所需要的工具。

安装Hexo

Hexo的安装方式相当简单。安装必备的应用程序后,使用 npm 指令安装即可,过程可能需要持续若干分钟。

1
$ npm install -g hexo-cli

安装完毕后,可以在CMD中使用hexo -v指令查看hexo版本以确定是否安装成功。

1
$ hexo -v

建站

安装阶段结束后开始建站,hexo可以使用init指令生成项目相关文件。

1
$ hexo init

执行完毕后,使用hexo s指令就可以在浏览器中输入“localhost:4000”访问博客,看到博客内容。

1
$ hexo s

Butterfly安装及配置

Butterfly的安装可以直接按照官方文档逐步进行。为保持博文结构完整性,同样将其中的内容摘抄过来,读者可能要注意命令的时效性。
首先,进入博客项目路径,呼出Git界面,输入以下命令。

1
git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly

然后,将博客项目路径中的_config.yml中的[theme]对应的值修改为[butterfly]。
安装完成后可以在博客项目路径中看到butterfly文件夹,其中包含了主题的配置文件_config.yml,复制其中的内容,在博客项目路径中创建_config.butterfly.yml,将之前复制的内容粘贴后保存。
(使用过程中未能正确配置mathjax,无法渲染公式,所以最后放弃butterfly使用next主题)

部署

如果希望其他人也能看到你的博客,那就需要将博客部署在服务器或Github上。Github完全可以满足笔者对博客的需求,所以并未探索如何将博客部署在服务器上,读者有相关需求可以自行探索。

创建Github仓库

创建仓库需要读者已经创建过Github账户,这里不对如何注册Github账户进行赘述。拥有Github账户后,需要在本地配置账户信息。在任意位置唤出git bash,通过以下指令配置用户和邮箱。

1
2
$ git config --global user.name "你的名字"
$ git config --global user.email "你的@邮箱.com"

创建的仓库要求与Github用户名完全相同,并勾选“Add a README file”选项。

创建SSH和GPGkeys

在git bash命令窗口中输入命令生成SSH密钥,命令如下所示,注意-C是大写字母C,邮箱要加引号。

1
$ ssh-keygen -t rsa -C "你的@邮箱.com"

生成的内容可以在路径“C:\用户\用户名.ssh\id_rsa.pub”中查看到,将其中所有内容复制。
在Github中打开个人设置页面,左侧选中“SSH and GPG keys”,Title中的内容读者可以任意定义,在Key中粘贴刚刚复制的内容,然后点击“Add SSH key”。

开始部署

在博客的项目路径中唤出git bash窗口,安装部署工具,指令如下所示。

1
$ npm install hexo-deployer-git --save

然后,在github中打开创建好的仓库,复制其git链接,如图所示。

然后修改博客项目路径中的“_config.yml”文件,在yml文件中,最下方可以看到“deploy:”,在其下方添加type、repo和branch,填写的内容如图所示。

推送至Github

使用clean指令清除缓存,然后使用g、d指令将博客内容推送至github,期间按照要求输入yes即可。

1
2
3
$ hexo c
$ hexo g
$ hexo d

执行完毕后,即可通过访问“[git_user_name].github.io”直接看到博客内容。
上述这种写博文、hexo clean、hexo g、hexo d更新博客的方式是hexo的基础用法。如果读者写博客的场景比较固定,不会涉及到多设备更新博客的话,hexo的基础用法已经足够满足需求了。但是如果写博文的设备并不固定,基础用法就不那么便利了。

配置Github Action

基础用法每次都会将本地的博文重新部署至github中,“删除文章”这一功能也是通过这种方式实现的,只要在本地删除博文后重新部署即可达到删除博文的目的。换句话说,如果在一个未保存全部博文的设备上更新内容,以往的心血就全被“删除”了。为避免上述情况出现,我们使用Github action来“备份”博客内容。首先,在Github中创建一个私有仓库,用于存储博客内容。然后,在本地编辑博文本,将新内容上传到博客内容仓库中,内容变动时触发Action,将新内容再部署到博客页面中。如果使用新设备撰写博客,只需要git clone博客内容仓库后编辑文本,重新push到仓库中即可。

创建存放博文内容的私有仓库

在创建过程中注意勾选private即可。

创建Token

访问 Github注意->右上角头像处->Settings->Developer Settings->Personal access tokens->generate new token,选择classic token即可,创建的 Token 名称随意,但必须勾选 repo 项 和 workflows 项。

创建好token后暂时不要关闭页面,这个token只在此处显示一次,关闭之后就无法找回Token内容。

配置Github Action

  1. 在本地的博客项目路径中创建[.github]文件夹,在其中创建[workflows]文件夹,在其中创建[autodeploy.yml]文件,其中内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
name: 自动部署
# 当有改动推送到main分支时,启动Action
on:
push:
branches:
- main
#2020年10月后github新建仓库默认分支改为main,注意更改
release:
types:
- published

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 检查分支
uses: actions/checkout@v2
with:
ref: main

- name: 安装 Node
uses: actions/setup-node@v1
with:
node-version: "16.x"

- name: 安装 Hexo
run: |
export TZ='Asia/Shanghai'
npm install hexo-cli -g

- name: 缓存 Hexo
id: cache-npm
uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
path: node_modules
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-

- name: 安装依赖
if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }}
run: |
npm install --save

- name: 生成静态文件
run: |
hexo clean
hexo generate

- name: 部署到Github
uses: JamesIves/github-pages-deploy-action@v4
with:
token: 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
repository-name: anzhiyu-a/anzhiyu-a.github.io
branch: main
folder: public
commit-message: "${{ github.event.head_commit.message }} Updated By Github Actions"

ps:

  • 注意node.js的版本(node-version)与当前安装的版本一直
  • 如果配置完成后,push后workflow报错,请参考Github Action配置
  1. 在博客项目路径/themes/butterfly中的[.git]文件夹删除
  2. 在博客项目路径中呼出Git窗口,运行以下命令
1
2
3
4
5
git init #初始化
git remote add origin git@github.com:[GithubUsername]/[SourceRepo].git #复制刚创建好的博文内容私有仓库的git链接
git checkout -b main # 切换到main分支,
#2020年10月后github新建仓库默认分支改为main,注意更改
# 如果不是,后面的所有设置的分支记得保持一致
  1. 运行git提交指令,将博客源码提交到github上。
1
2
3
4
git add .
git commit -m "github action update"
git push origin main
#2020年10月后github新建仓库默认分支改为main,注意更改

总结

此时,博客更新的逻辑就变为,博客项目路径中的内容变动后,会提交至私有博文内容仓库中,内容仓库变动后Github Action会将内容重新部署到github.io仓库中。

如何使用?

想要撰写新博客时,打开博客项目路径,唤出git bash窗口,输入new指令创建md文件。

1
$ hexo new "博客名"

提示创建成功后,在生成的md文件中撰写文章,然后git add, git commmit, git push后,重新访问github.io页面即可看到更新内容。

小tips

1.post_asset_folder
当博文中需要引入图片等资源时,可以将_config.yml中的post_asset_folder参数设置为true。修改配置文件后,hexo new在创建md文件的同时还会为该博文创建一个同名的文件夹,用以存放博文中所需要的资源。要注意在博文中引入资源的方式,引入方法如图所示,使用传统的“叹号中括号括号”的引用方式是无效的。

图片未正常显示,先尝试删除Hexo-asset-image、Hexo-image-link等插件,按照官方文档逐步重新实现图片引用,还是不能正常渲染再参考其它博文。

查看网页原代码发现图片引用的位置全是.com文件:
图片显示bug参考
hexo-asset-image部分

hexo博客中插入图片失败——解决思路及个人最终解决办法

解决hexo-asset-image的图片地址错误问题

Notes on Hexo

hexo中完美插入本地图片

2.创建类别、标签
网上很多hexo创建类别的教程,笔者在最开始创建分类时陷入了一个误区,就是觉得要“先生成一个类别,然后在博文中才可以设置为这个类别”,其实不是。
实际上只要按照教程操作之后,你就可以任意的为你的博文添加类别了,hexo new page categories更“像是”允许作者为博文添加类别的开关。
3.引用历史博文
详见如何在Hexo的博文中引用自己的文章,要注意中间写的是文件名,不是博文title名。
4.博文分页
当按类别访问博文且该类别博文数量较多时,Hexo会根据博客数量进行分页,默认一页内摆放十篇博文,可以在_config.yml中的per_page属性进行修改。

损失函数

Posted on 2023-03-22 |

梯度下降法,下降的是谁的梯度?损失函数的梯度。
如何设计出损失函数?至少三个方法:最小二乘法、极大似然估计法、交叉熵法

两个概率模型是如何比较的

博客模板

Posted on 2011-03-27 | In Leetcode题录 |
<i class="fa fa-angle-left"></i>1…78

77 posts
10 categories
14 tags
© 2024 Antique
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4