[LC]46.全排列 题目给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 分析标记数组每次枚举一个位置$pos$的可能的值,当前枚举的值在标记数组中标记,然后继续枚举下一个位置。 代码 1234567891011121314151617181920212223242526272829class Solution {public: vector<v 2024-10-18 算法 #algorithm #leetcode #回溯
[LC]24.接雨水 题目给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 分析暴力对于每个位置 i ,分别找到其左右的最大高度$leftMax$和$rightMax$,那么该点能接的雨水值为$min(leftMax, rightMax) - height_i$. 时间复杂度: $O(n^2)$ 动态规划观察暴力算法,我们不难发现,时间复杂度高的原因主要是因为对于每个 2024-10-18 算法 #algorithm #leetcode #dp #单调栈 #双指针
[LC]146.LRU缓存 题目请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void put(int key, int value) 如果关键字 key 2024-10-18 算法 #algorithm #leetcode
[C++]现代C++语言核心特性解析 Chapter 3 auto占位符(C++11~C++17)1 重新定义的auto关键字C++11标准赋予了auto新的含义:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。 123456auto i = 5; // 推断为intauto str = "hello auto"; // 推断为const char 2024-10-09 编程语言 #C++
[LC]2343.裁剪数字后查询第k小的数字 题目给你一个下标从 0 开始的字符串数组 nums ,其中每个字符串 长度相等 且只包含数字。 再给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [ki, trimi] 。对于每个 queries[i] ,你需要: 将 nums 中每个数字 裁剪 到剩下 最右边 trimi 个数位。 在裁剪过后的数字中,找到 nums 中第 ki 小数字对应的 下标 。 2024-10-08 算法 #algorithm #leetcode
[LC]912.排序数组 题目给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 分析堆排序代码 12345678910111213141516171819202122232425262728293031323334class Solution {public: vector<int> 2024-10-07 算法 #algorithm #leetcode
[LC]215.数组中的第k个最大元素 题目给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 分析快速选择经典算法,寻找第k个元素。可以借用快速排序的划分操作,每次划分操作将一个枢轴元素放置到它排好序后的正确位置上,且所有小于等于枢轴元素的元素都在该位置之前,所有大于等于枢 2024-10-06 算法 > 分治算法 #algorithm #分治 #leetcode
[LC]191.位1的个数 题目分析逐位数这题比较简单,直接看代码 123456789class Solution {public: int hammingWeight(int n) { size_t hmw = 0; for (size_t i = 0; i != sizeof(n) * 8 && n > 0; ++i, n >>= 1 2024-10-06 算法 #algorithm #leetcode
[LC]190.颠倒二进制位 题目颠倒给定的 32 位无符号整数的二进制位。 分析按位颠倒我们从低到高依次取给定数的每一个二进制位$i$,将其放置在$31 - i$的位置上即可。 代码 1234567891011class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t ans = 0; for ( 2024-10-06 算法 > 分治算法 #algorithm #分治 #leetcode
[LC]109.有序链表转换二叉搜索树 题目给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为平衡二叉搜索树。 分析分治我们将链表中间偏左的结点$m*$作为根节点构建BST,由此将原问题规约为两个规模更小的子问题,分别递归求解,得到左子树和右子树,将其和根结点组合后返回即可。 代码 12345678910111213141516171819202122232425class Solution {publ 2024-10-06 算法 > 分治算法 #algorithm #分治 #leetcode