Jerring


  • 首页

  • 标签

  • 分类

  • 归档

LeetCode57-插入区间

发表于 2019-07-15 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/insert-interval/

中文链接:https://leetcode-cn.com/problems/insert-interval/

题目详述

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

1
2
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]

示例 2:

1
2
3
输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
阅读全文 »

LeetCode228-汇总区间

发表于 2019-07-15 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/summary-ranges/

中文链接:https://leetcode-cn.com/problems/summary-ranges/

题目详述

给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。

示例 1:

1
2
3
输入: [0,1,2,4,5,7]
输出: ["0->2","4->5","7"]
解释: 0,1,2 可组成一个连续的区间; 4,5 可组成一个连续的区间。

示例 2:

1
2
3
输入: [0,2,3,4,6,8,9]
输出: ["0","2->4","6","8->9"]
解释: 2,3,4 可组成一个连续的区间; 8,9 可组成一个连续的区间。
阅读全文 »

LeetCode930-和相同的二元子数组

发表于 2019-07-15 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/binary-subarrays-with-sum/

中文链接:https://leetcode-cn.com/problems/binary-subarrays-with-sum/

题目详述

在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组。

示例:

1
2
3
4
5
6
7
8
输入:A = [1,0,1,0,1], S = 2
输出:4
解释:
如下面黑体所示,有 4 个满足题目要求的子数组:
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]

提示:

  1. A.length <= 30000
  2. 0 <= S <= A.length
  3. A[i] 为 0 或 1
阅读全文 »

LeetCode883-三维形体投影面积

发表于 2019-07-15 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/projection-area-of-3d-shapes/

中文链接:https://leetcode-cn.com/problems/projection-area-of-3d-shapes/

题目详述

在 N N 的网格中,我们放置了一些与 x,y,z 三轴对齐的 1 1 * 1 立方体。

每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。

现在,我们查看这些立方体在 xy、yz 和 zx 平面上的投影。

投影就像影子,将三维形体映射到一个二维平面上。

在这里,从顶部、前面和侧面看立方体时,我们会看到“影子”。

返回所有三个投影的总面积。

示例 1:

1
2
输入:[[2]]
输出:5

示例 2:

1
2
3
4
输入:[[1,2],[3,4]]
输出:17
解释:
这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)。

示例 3:

1
2
输入:[[1,0],[0,2]]
输出:8

示例 4:

1
2
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:14

示例 5:

1
2
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:21

提示:

  • 1 <= grid.length = grid[0].length <= 50
  • 0 <= grid[i][j] <= 50
阅读全文 »

Redis底层数据结构

发表于 2019-07-14 | 分类于 LeetCode

简单动态字符串

Redis 只会使用 C 字符串作为字面量,在大多数情况下,Redis 使用 SDS(Simple Dynamic String,简单动态字符串)作为字符串表示。

SDS 的定义如下:

每个 sds.h/sdshdr 结构表示一个SDS 值。

1
2
3
4
5
6
7
8
9
10
struct sdshdr {
// 记录 buf 数组中已使用的字节数,它等于 SDS 所保存字符串的长度
int len;

// 记录 buf 数组中未使用字节的数量
int free;

// 字节数组,用于保存字符串
char buf[];
};

SDS 遵循 C 字符串以 ‘\0’ 结尾的惯例,这个一字节空间不算在 len 属性中,这个空间分配以及添加到末尾的操作是由 SDS 函数自动完成的,所以这个空字符对于使用者来说是透明的。这种做法的好处是可以重用一部分操作 C 字符串的函数。

比起 C 字符串,SDS 具有以下优点:

  • 常数时间获取字符串长度(通过 len)。
  • 杜绝缓冲区溢出(扩容时一般采取 free 等于 len 的方式,free 不超过 1MB)。
  • 减少修改字符串长度时所需的内存重新分配次数(空间预分配和惰性释放)。
  • 二进制安全(存在 len 属性)。
  • 兼容部分 C 字符串函数。

链表

链表节点表示:

1
2
3
4
5
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
}listNode;

链表表示:

1
2
3
4
5
6
7
8
typedef struct list {
listNode *head; // 头节点
listNode *tail; // 尾节点
unsigned long len; // 链表所包含节点数量
void *(*dup)(void *ptr); // 节点值复值函数
void *(*free)(void *ptr); // 节点值释放函数
void *(*match)(void *ptr, void *key); // 节点值对比函数
}list;
  • 链表被广泛用于实现 Redis 的各种功能,比如列表键、发布与订阅、慢查询、监视器等。
  • 头节点的前置指针和尾节点的后置指针都指向 NULL,链表实现为双端无环链表。
  • 获取头节点、尾节点、链表长度的时间复杂度为 O(1),获取某个节点的前置节点和后置节点的复杂度也为 O(1)。
  • 通过为链表设置不同的类型特定函数,Redis 的链表可以用于保存各种类型不同的值。
阅读全文 »

LeetCode862-和至少为K的最短子数组

发表于 2019-07-14 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/

中文链接:https://leetcode-cn.com/problems/shortest-subarray-with-sum-at-least-k/

题目详述

返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。

如果没有和至少为 K 的非空子数组,返回 -1 。

示例 1:

1
2
输入:A = [1], K = 1
输出:1

示例 2:

1
2
输入:A = [1,2], K = 4
输出:-1

示例 3:

1
2
输入:A = [2,-1,2], K = 3
输出:3

提示:

  1. 1 <= A.length <= 50000
  2. -10 ^ 5 <= A[i] <= 10 ^ 5
  3. 1 <= K <= 10 ^ 9
阅读全文 »

LeetCode978-最长湍流子数组

发表于 2019-07-14 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/longest-turbulent-subarray/

中文链接:https://leetcode-cn.com/problems/longest-turbulent-subarray/

题目详述

当 A 的子数组 A[i], A[i+1], …, A[j] 满足下列条件时,我们称其为湍流子数组:

  • 若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
  • 或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。

也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。

返回 A 的最大湍流子数组的长度。

示例 1:

1
2
3
输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])

示例 2:

1
2
输入:[4,8,12,16]
输出:2

示例 3:

1
2
输入:[100]
输出:1

提示:

  1. 1 <= A.length <= 40000
  2. 0 <= A[i] <= 10^9
阅读全文 »

LeetCode384-打乱数组

发表于 2019-07-14 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/shuffle-an-array/

中文链接:https://leetcode-cn.com/problems/shuffle-an-array/

题目详述

打乱一个没有重复元素的数组。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
// 以数字集合 1, 2 和 3 初始化数组。
int[] nums = {1,2,3};
Solution solution = new Solution(nums);

// 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
solution.shuffle();

// 重设数组到它的初始状态[1,2,3]。
solution.reset();

// 随机返回数组[1,2,3]打乱后的结果。
solution.shuffle();
阅读全文 »

LeetCode412-FizzBuzz

发表于 2019-07-14 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/fizz-buzz/

中文链接:https://leetcode-cn.com/problems/fizz-buzz/

题目详述

写一个程序,输出从 1 到 n 数字的字符串表示。

  1. 如果 n 是3的倍数,输出“Fizz”;

  2. 如果 n 是5的倍数,输出“Buzz”;

  3. 如果 n 同时是3和5的倍数,输出 “FizzBuzz”。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
n = 15,

返回:
[
"1",
"2",
"Fizz",
"4",
"Buzz",
"Fizz",
"7",
"8",
"Fizz",
"Buzz",
"11",
"Fizz",
"13",
"14",
"FizzBuzz"
]
阅读全文 »

LeetCode987-二叉树的垂序遍历

发表于 2019-07-13 | 分类于 LeetCode

题目链接

英文链接:https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/

中文链接:https://leetcode-cn.com/problems/vertical-order-traversal-of-a-binary-tree/

题目详述

给定二叉树,按垂序遍历返回其结点值。

对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y-1) 和 (X+1, Y-1)。

把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值( Y 坐标递减)。

如果两个结点位置相同,则首先报告的结点值较小。

按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。

示例 1:

1
2
3
4
5
6
7
8
输入:[3,9,20,null,null,15,7]
输出:[[9],[3,15],[20],[7]]
解释:
在不丧失其普遍性的情况下,我们可以假设根结点位于 (0, 0):
然后,值为 9 的结点出现在 (-1, -1);
值为 3 和 15 的两个结点分别出现在 (0, 0) 和 (0, -2);
值为 20 的结点出现在 (1, -1);
值为 7 的结点出现在 (2, -2)。

示例 2:

1
2
3
4
5
输入:[1,2,3,4,5,6,7]
输出:[[4],[2],[1,5,6],[3],[7]]
解释:
根据给定的方案,值为 5 和 6 的两个结点出现在同一位置。
然而,在报告 "[1,5,6]" 中,结点值 5 排在前面,因为 5 小于 6。

提示:

  1. 树的结点数介于 1 和 1000 之间。
  2. 每个结点值介于 0 和 1000 之间。
阅读全文 »
1…789…47
Jerring

Jerring

Talk is cheap, show me the code.

462 日志
4 分类
24 标签
© 2019 Jerring
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4