俄罗斯套娃信封问题
力扣 354. 俄罗斯套娃信封问题题目说明给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
不允许旋转信封。
示例例1123输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3 解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。
笔者理解此题是一道数组算法问题,在力扣题库中被定义为困难题。
解法当笔者阅读完此题后,发现此题比较重要的是两点:大家想必都会想到要将数组排序,然后w升序依次排序,这样前一个信封就有可能被下一个信封装下,但是需要注意的是,题目中提到,”当另一个信封的宽度和高度都比这个信封大的时候”才能放进去,所以我们要将宽度相同的信封按h降序排列,然后我们就这样把这个问题变成一维问题了,只要比较h,最长的一个升序子序列就是套娃的最终答案,
例如:[[1,2],[ ...
比特位计数
力扣 338. 比特位计数题目说明给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
要求算法的空间复杂度为O(n)。
你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。
示例例112输入: 2输出: [0,1,1]
例212输入: 5输出: [0,1,1,2,1,2]
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题涉及到了位运算和动态规划。在此题中,我们需要计算出到n的每个数的二进制数中1的个数,这不禁让我想起以前做过的一个题中使用的方法:**(n&n-1)可以消除n的二进制数最靠右的一个1**,因此,我们可以通过这个方法来依次向后延展计算,让我们来看看具体如何实现的吧。
例如:7的二进制数为111,7&6就是111&a ...
二维区域和检索-矩阵不可变
力扣 304. 二维区域和检索 - 矩阵不可变题目说明给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。
上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。
你可以假设矩阵不可变。
会多次调用 sumRegion 方法。
你可以假设 row1 ≤ row2 且 col1 ≤ col2。
示例例1123456789101112给定 matrix = [ [3, 0, 1, 4, 2], [5, 6, 3, 2, 1], [1, 2, 0, 1, 5], [4, 1, 0, 1, 7], [1, 0, 3, 0, 5]]sumRegion(2, 1, 4, 3) -> 8sumRegion(1, 1, 2, 2) -> 11sumRegion(1, 2, 2, 4) -> 12
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题和昨天的 ...
区域和检索-数组不可变
力扣 303. 区域和检索 - 数组不可变题目说明给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。
实现 NumArray 类:
NumArray(int[] nums) 使用数组 nums 初始化对象
int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], … , nums[j]))
示例例1123456789101112输入:["NumArray", "sumRange", "sumRange", "sumRange"][[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]输出:[null, 1, -1, -3]解释:NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);numArray.s ...
单调数列
力扣 896. 单调数列题目说明如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。
当给定的数组 A 是单调数组时返回 true,否则返回 false。
1 <= A.length <= 50000
-100000 <= A[i] <= 100000
示例例112输入:[1,2,3]输出:true
例212345678910输入:[1,2,2,3][6,5,4,4][1,3,2][1,2,4,5][1,1,1]输出:truetruefalsetruetrue
笔者理解此题是一道数组算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题还是比较容易,遍历比较数组,注意两数相等符合单调即可,让我们来看看具体如何实现的吧。
实现1234567891011121314151617181920212223242526272829public boolean ...
翻转图像
力扣 832. 翻转图像题目说明给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。
水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。
反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。
1 <= A.length = A[0].length <= 20
0 <= A[i][j] <= 1
示例例11234输入:[[1,1,0],[1,0,1],[0,0,0]]输出:[[1,0,0],[0,1,0],[1,1,1]]解释:首先翻转每一行: [[0,1,1],[1,0,1],[0,0,0]]; 然后反转图片: [[1,0,0],[0,1,0],[1,1,1]]
例21234输入:[[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]输出:[[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]解释:首先翻转每一行: [[0,0,1, ...
爱生气的书店老板
力扣 1052. 爱生气的书店老板题目说明今天,书店老板有一家店打算试营业customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。
在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。
1 <= X <= customers.length == grumpy.length <= 20000
0 <= customers[i] <= 1000
0 <= grumpy[i] <= 1
示例例112345输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3输出:16解释:书店老板在最后 3 分钟保持冷静。感到满意的最大客户数量 = 1 + 1 + 1 ...
托普利茨矩阵
力扣 766. 托普利茨矩阵题目说明给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。
m == matrix.length
n == matrix[i].length
1 <= m, n <= 20
0 <= matrix[i][j] <= 99
示例例1
123456输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]输出:true解释:在上述矩阵中, 其对角线为: "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。 各条对角线上的所有元素均相同, 因此答案是 True 。
例2
12345输入:[1,2,2,3,1,4,2]输出:6解释:输入数组的度是3,元素2的出现频数最大,为3. ...
数组的度(java实现)
力扣 697. 数组的度题目说明给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
nums.length 在1到 50,000 区间范围内。
nums[i] 是一个在 0 到 49,999 范围内的整数。
示例例11234567输入:[1, 2, 2, 3, 1]输出:2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]最短连续子数组[2, 2]的长度为2,所以返回2.
例212345输入:[1,2,2,3,1,4,2]输出:6解释:输入数组的度是3,元素2的出现频数最大,为3.最短连续子数组[2,2,3,1,4,2]的长度为6,所以返回6.
笔者理解此题是一道数组算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题运用哈希 ...
最大连续1的个数III(java实现)
力扣 1004. 最大连续1的个数 III题目说明给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
1 <= A.length <= 20000
0 <= K <= A.length
A[i] 为 0 或 1
示例例112345输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释: [1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。
例212345输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3输出:10解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 10。
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题典型的运用了滑动窗口,通过标记窗口前后端来获取最长(连续)1子数组,让我们来看看具体如何实现的吧 ...







