濬哲的博客

人生如棋,落子无悔

为什么要绑定域名

在使用 Hexo 搭建个人博客时,默认的域名是 GitHub Pages 提供的二级域名(如 username.github.io)。为了提升网站的专业性和可识别性,我们通常会选择绑定一个自定义的顶级域名(如 example.com)。

并且对于程序员来讲,拥有一个属于自己的域名看起来超酷的!

阅读全文 »

LeetCode209. 长度最小的子数组

题目链接:209. 长度最小的子数组

题目要点与解题思路

暴力解法

不难想到暴力解法,时间复杂度是,就是以每一个元素为起始位置,然后往下看,直到找到满足要求的子数组。这种情况下结束位置会被反复遍历

滑动窗口

滑动窗口就是不断调节起始位置和终止位置,然后找到满足要求的子数组 在暴力循环中,一个 for 遍历起始位置,一个 for 遍历结束位置,结束位置是从每个起始位置开始枚举

我们思考能否用一个 for 循环来解决这个问题: 首先应该表示起始位置还是终止位置呢? 答案是终止位置,因为如果是起始位置的话一定会落入重复遍历终止位置的困境 我们移动终止位置,不断增长窗口,当窗口内的元素和大于等于目标值时,开始移动起始位置,直到窗口内的元素和小于目标值为止

阅读全文 »

LeetCode704. 二分查找

题目链接:704. 二分查找

题目要点与解题思路

首先我们明确一下二分查找的条件:

  1. 数组是有序的
  2. 数组中没有重复元素(否则返回的下标可能会不唯一)

然后要注意二分查找的边界条件,有两种写法,左闭右开和左闭右闭,我是用的左闭右闭的写法。

阅读全文 »

双指针有大用处: 027. 移除元素

双指针还能延伸出滑动窗口,很多子数组之类的就是滑动窗口问题 字节后端一面中的编程题就是一道滑动窗口

最长非重复子字符串的长度,abcabc 这种,最长子字符串是 3

这道题完全可以仿照 209. 长度最小的子数组来做

题目简介

题目链接

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 示例 2:

输入:n = 1 输出:[[1]]

提示:

1 <= n <= 20

思路

这道题很容易把人绕晕进去,如果找不到一个统一的写法,会产生大量的逻辑判断。下面我给出一个很巧妙的方法,不光是对这种正方形有用,同时也适用于长方形

我们访问的顺序就是最外面这一圈,像是剥洋葱一样,一条一条的把边剥开,然后每次处理的就是一个新的矩形,代码其实非常好理解,up,down, left, right 分别表示矩形的上下左右边界,count 表示当前要填入的数字,vec 是结果矩阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int up = 0, down = n - 1, left = 0, right = n - 1;
int count = 1;
vector<vector<int>> vec(n, vector<int>(n, 0));
while (1) {
for (int i = left; i <= right; i++) vec[up][i] = count++;
if (++up > down) break;
for (int i = up; i <= down; i++) vec[i][right] = count++;
if (--right < left) break;
for (int i = right; i >= left; i--) vec[down][i] = count++;
if (--down < up) break;
for (int i = down; i >= up; i--) vec[i][left] = count++;
if (++left > right) break;
}
return vec;
}
};

时间复杂度 O (n2),空间复杂度 O (n2)

题目简介

题目链接

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl + 1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。 示例 2:

输入:target = 4, nums = [1,4,4] 输出:1 示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0

提示:

1 <= target <= 109 1 <= nums.length <= 105 1 <= nums[i] <= 104

进阶:

如果你已经实现 O (n) 时间复杂度的解法,请尝试设计一个 O (n log (n)) 时间复杂度的解法。

阅读全文 »

题目简介

977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]

示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]

提示: 1 <= nums.length <= 104 -104 <= nums [i] <= 104 nums 已按 非递减顺序 排序

进阶: 请你设计时间复杂度为 O (n) 的算法解决本问题

阅读全文 »

题目简介

题目链接 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。 返回 k。 用户评测:

评测机将使用以下代码测试您的解决方案:

示例 1:

输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2,,] 解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。 你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。 示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3,,,_] 解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。 注意这五个元素可以任意顺序返回。 你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

提示:

0 <= nums.length <= 100 0 <= nums[i] <= 50 0 <= val <= 100

阅读全文 »

题目简介

题目链接

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1

提示:

你可以假设 nums 中的所有元素是不重复的。 n 将在 [1, 10000] 之间。 nums 的每个元素都将在 [-9999, 9999] 之间。

阅读全文 »

前言

前段时间自己折腾了一下博客,初步建立起了自己的小站,今天心血来潮在谷歌搜索自己之前写的从零搭建个人博客的文章,结果在 Google 上面翻了十页都没有翻到,我一开始还以为是因为发了没多久的缘故,后来一查才知道 GitHub Pages 屏蔽了 Google 的爬虫,所以在 Google 里是搜索不到 GitHub Pages 上面的网页的。

这怎么行?!

对于我来说,我写博客主要是为了将自己学习的知识进行一个输出,虽然不是什么高大上的东西,但是我相信一定有和我一样刚刚在计算机领域起步,并且热爱探索、折腾工具的朋友,我的这些经验和感悟或许就能给大家带来一点小小的启发。另外,因为是要写给别人看,所以要更加注重自己语言的逻辑组织。并且要把一件事能够完全的和别人讲清楚,还需要自己更高层次的理解,这反过来也倒逼了我自己去进行更深度的思考,让我更好的理解掌握知识。

话说回来,我不是写只给自己看的日记的,那些我都存放在本地的 obsidian 里面。之后或许有机会写一些我折腾 obsidian 的记录(),我希望我的博客能在网络的海洋里有幸被人看到。

阅读全文 »
0%