LeetCode 刷题记录——从零开始记录自己一些不会的

1. 最多可以摧毁的敌人城堡数目

  • 题意

image-20230902220112381

  • 思路

两层循环,太low了

用一个变量记录前一个位置

  • 代码
class Solution {
public:int captureForts(vector<int>& forts) {int ans = 0, pre = -1;for (int i = 0; i < forts.size(); i++) {if (forts[i] == 1 || forts[i] == -1) {if (pre >= 0 && forts[i] != forts[pre]) {ans = max(ans, i - pre - 1);}pre = i;}}return ans;}
};

2. 到达终点的数字

  • 题意

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 思路

754-2.png

image-20230902222848338

  • 代码
class Solution {
public:int reachNumber(int target) {target = abs(target);int s = 0, n = 0;while (s < target || (s - target) % 2) // 没有到达(越过)终点,或者相距奇数s += ++n;return n;}
};

3. 单词的压缩编码

  • 题意

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 思路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 代码
class Solution {
public:int minimumLengthEncoding(vector<string>& words) {unordered_set<string> good(words.begin(), words.end());for (const string& word: words) {for (int k = 1; k < word.size(); ++k) {good.erase(word.substr(k));}}int ans = 0;for (const string& word: good) {ans += word.size() + 1;}return ans;}
};
  • 思路2

去找到是否不同的单词具有相同的后缀,我们可以将其反序之后插入字典树中。例如,我们有 “time” 和 “me”,可以将 “emit” 和 “em” 插入字典树中。

fig2

然后,字典树的叶子节点(没有孩子的节点)就代表没有后缀的单词,统计叶子节点代表的单词长度加一的和即为我们要的答案。

  • 代码
class TrieNode{TrieNode* children[27];public:int count;TrieNode() {for (int i = 0;i < 26;i ++) children[i] = NULL;count = 0;}TrieNode* get(char c) {if (children[c-'a'] == NULL) {children[c-'a'] = new TrieNode();count ++;}return children[c-'a'];}
};
class Solution{public:int minimumLengthEncoding(vector<string>& words) {TrieNode* trie = new TrieNode();unordered_map<TrieNode*,int> nodes;for (int i = 0;i < (int)words.size();i ++) {string word = words[i];TrieNode* cur = trie;for (int j = word.length()-1;j >= 0;j --) cur = cur->get(word[j]);nodes[cur] = i;}int ans = 0;for (auto& [node,idx] : nodes) {if (node->count == 0) {ans += words[idx].length() + 1;}}return ans;}
};

字典树

4. 逃脱阻碍着

  • 题意

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 思路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另:

image-20230903121017850

  • 代码
class Solution {
public:int manhattanDistance(vector<int>& point1, vector<int>& point2) {return abs(point1[0] - point2[0]) + abs(point1[1] - point2[1]);}bool escapeGhosts(vector<vector<int>>& ghosts, vector<int>& target) {vector<int> source(2);int distance = manhattanDistance(source, target);for (auto& ghost : ghosts) {int ghostDistance = manhattanDistance(ghost, target);if (ghostDistance <= distance) {return false;}}return true;}
};

5. 寻找两个正序数组的中位数 O ( l o g ( m + n ) ) O(log(m+n)) O(log(m+n))

  • 题意

image-20230831105355390

  • 思路

主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较

这里的 “/” 表示整除
s1 中小于等于 pivot1 的元素有 nums1[0 … k/2-2] 共计 k/2-1 个

  • nums2 中小于等于 pivot2 的元素有 nums2[0 … k/2-2] 共计 k/2-1 个
    ivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个
  • 这样 pivot 本身最大也只能是第 k-1 小的元素
    pivot = pivot1,那么 nums1[0 … k/2-1] 都不可能是第 k 小的元素。把这些元素全部 “删除”,剩下的作为新的 nums1 数组
  • 如果 pivot = pivot2,那么 nums2[0 … k/2-1] 都不可能是第 k 小的元素。把这些元素全部 “删除”,剩下的作为新的 nums2 数组
    们 “删除” 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数
  • 代码
class Solution {
public:int getKthElement(const vector<int>& nums1, const vector<int>& nums2, int k) {int m = nums1.size();int n = nums2.size();int index1 = 0, index2 = 0;while (true) {// 边界情况if (index1 == m) {return nums2[index2 + k - 1];}if (index2 == n) {return nums1[index1 + k - 1];}if (k == 1) {return min(nums1[index1], nums2[index2]);}// 正常情况int newIndex1 = min(index1 + k / 2 - 1, m - 1);int newIndex2 = min(index2 + k / 2 - 1, n - 1);int pivot1 = nums1[newIndex1];int pivot2 = nums2[newIndex2];if (pivot1 <= pivot2) {k -= newIndex1 - index1 + 1;index1 = newIndex1 + 1;}else {k -= newIndex2 - index2 + 1;index2 = newIndex2 + 1;}}}double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int totalLength = nums1.size() + nums2.size();if (totalLength % 2 == 1) {return getKthElement(nums1, nums2, (totalLength + 1) / 2);}else {return (getKthElement(nums1, nums2, totalLength / 2) + getKthElement(nums1, nums2, totalLength / 2 + 1)) / 2.0;}}
};

6. 正则表达式匹配

  • 题意

image-20230831142952316

  • 思路

点号通配符其实很好实现,s 中的任何字符,只要遇到 . 通配符,无脑匹配就完事了。主要是这个星号通配符不好实现,一旦遇到 * 通配符,前面的那个字符可以选择重复一次,可以重复多次,也可以一次都不出现,这该怎么办?

对于这个问题,答案很简单,对于所有可能出现的情况,全部穷举一遍,只要有一种情况可以完成匹配,就认为 p 可以匹配 s。那么一旦涉及两个字符串的穷举,我们就应该条件反射地想到动态规划的技巧了。

  • 代码

待补

7. 一个图中联通三元组的最小度数

  • 题意

image-20230831143639125

待补

8. 只出现一次的数字Ⅱ 位运算

  • 题意

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 **三次 。**请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

  • 思路

image-20230831151525370

  • 代码
class Solution {
public:int singleNumber(vector<int>& nums) {int ans = 0;for (int i = 0; i < 32; ++i) {int total = 0;for (int num: nums) {total += ((num >> i) & 1);}if (total % 3) {ans |= (1 << i);}}return ans;}
};

9. 数字范围按位与

  • 题意

给你两个整数 leftright ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 leftright 端点)。

  • 思路

m和n的二进制串的最长公共前缀

image.png

  • 代码
class Solution {
public:int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n = n & (n - 1);}return n;}
};
Brian Kernighan 算法

10. 阶乘后的零

  • 题意

image-20230831155540328

  • 思路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 代码
class Solution {
public:int trailingZeroes(int n) {int ans = 0;while (n) {n /= 5;ans += n;}return ans;}
};

11. 最深叶节点的最近公共祖先

  • 题意

给你一个有根节点 root 的二叉树,返回它最深的叶节点的最近公共祖先。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20230906224129121

  • 思路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 代码
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:pair<TreeNode*,int> f(TreeNode* root) {if (!root) {return {root,0};}auto left = f(root->left);auto right = f(root->right);if (left.second > right.second) {return {left.first,left.second+1};}if (left.second < right.second) {return {right.first,right.second+1};}return {root,left.second+1};}TreeNode* lcaDeepestLeaves(TreeNode* root) {return f(root).first;}
};

12. 连续整数求和

  • 题意

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 思路

image-20230907091741158

  • 代码
class Solution {
public:int consecutiveNumbersSum(int n) {int ans = 0;int bound = 2 * n;for (int k = 1; k * (k + 1) <= bound; k++) {if (isKConsecutive(n, k)) {ans++;}}return ans;}bool isKConsecutive(int n, int k) {if (k % 2 == 1) {return n % k == 0;} else {return n % k != 0 && 2 * n % k == 0;}}
};

13. 构造最长非递减子数组

  • 题意

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 思路

动态规划

  • 代码
class Solution {
public:int maxNonDecreasingLength(vector<int>& nums1, vector<int>& nums2) {int ans = 1, n = nums1.size();vector<vector<int>> dp(n, vector<int>(2, 1));for (int i = 1; i < n; ++i) {if (nums1[i] >= nums1[i-1]) dp[i][0] = dp[i-1][0] + 1;if (nums1[i] >= nums2[i-1]) dp[i][0] = max(dp[i][0], dp[i-1][1] + 1);if (nums2[i] >= nums1[i-1]) dp[i][1] = dp[i-1][0] + 1;if (nums2[i] >= nums2[i-1]) dp[i][1] = max(dp[i][1], dp[i-1][1] + 1);ans = max(ans, max(dp[i][0], dp[i][1]));}return ans;}
};

14. 等值距离和

  • 题意

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 思路

分组+前缀和

  • 代码
class Solution {
public:vector<long long> distance(vector<int> &nums) {int n = nums.size();unordered_map<int, vector<int>> groups;for (int i = 0; i < n; ++i)groups[nums[i]].push_back(i); // 相同元素分到同一组,记录下标vector<long long> ans(n);long long s[n + 1];s[0] = 0;for (auto &[_, a]: groups) {int m = a.size();for (int i = 0; i < m; ++i)s[i + 1] = s[i] + a[i]; // 前缀和for (int i = 0; i < m; ++i) {long long target = a[i];long long left = target * i - s[i]; // 蓝色面积long long right = s[m] - s[i] - target * (m - i); // 绿色面积ans[target] = left + right;}}return ans;}
};

15. 使数组元素全部相等的最少操作次数

  • 题意

image-20230907104451436

  • 思路

t3.png

  • 代码
class Solution {
public:vector<long long> minOperations(vector<int> &nums, vector<int> &queries) {sort(nums.begin(), nums.end());int n = nums.size();long long sum[n + 1]; // 前缀和sum[0] = 0;for (int i = 0; i < n; ++i)sum[i + 1] = sum[i] + nums[i];int m = queries.size();vector<long long> ans(m);for (int i = 0; i < m; ++i) {int q = queries[i];long long j = lower_bound(nums.begin(), nums.end(), q) - nums.begin();long long left = q * j - sum[j]; // 蓝色面积long long right = sum[n] - sum[j] - q * (n - j); // 绿色面积ans[i] = left + right;}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/125565.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04、javascript 修改对象中原有的属性值、修改对象中原有属性的名字(两种方式)、添加对象中新属性等的操作

1、修改对象中原有的属性值 其一、代码为&#xff1a; // 想将 obj 中的 flag 值&#xff0c;根据不同的值来变化(即&#xff1a;修改对象中原有的属性值)&#xff1b; let obj {"port": "port_0","desc": "desc_0","flag&quo…

IP应用场景查询API:深入了解网络用户行为的利器

前言 随着数字时代的不断发展&#xff0c;互联网已经成为人们生活的重要组成部分。而随着越来越多的业务和社交活动迁移到在线平台上&#xff0c;了解和理解网络用户行为变得至关重要。为了满足这个需求&#xff0c;IP 应用场景查询 API 崭露头角&#xff0c;成为深入了解网络…

安卓绘制原理概览

绘制原理 Android 程序员都知道 Android 的绘制流程分为 Measure、Layout、Draw 三步骤&#xff0c;其中 Measure 负责测量 View 的大小Layout 负责确定 View 的位置Draw 负责将 View 画在屏幕上 由 ViewRootImpl 实现的 performTraversal 方法是 Measure、layout、draw 的真正…

Linux创建新文件的几种方式

第一种是 vi 文件名&#xff0c;然后进入vi编辑&#xff0c;完了之后保存退出&#xff1b;然后ls看一下&#xff0c;文件有了&#xff1b; 在终端输入 cat > 文件名&#xff0c;这没用过&#xff1b;输入以后回车&#xff0c;不会退出命令&#xff1b;输入一行文字&#xff…

TLA+学习记录1——hello world

0x01 TLA是个好工具 编程人员一个好习惯是凡事都想偷懒&#xff0c;当然是指要科学地偷懒&#xff0c;而不是真的偷懒。一直想找到一种能检验写出的代码&#xff0c;做出的设计是否真的完全正确&#xff0c;而不是靠经验检视、代码Review、反复测试去检验。因为上述方法不管怎…

学习心得07:C#

之前也没有看过C#的书&#xff0c;C#的程序倒是搞了一些。好在项目不大&#xff0c;我又会套路。 C#很象是JAVA。好像就是JAVA出来之后&#xff0c;微软抄的。好东西就要学习&#xff0c;这不丢脸。 我倒是想&#xff0c;有没有办法把JAVA和C#进行映射&#xff0c;然后直接编译…

Unity入门教程||创建项目(上)

一、介绍 目的&#xff1a;通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏&#xff0c;熟悉使用Unity进行游戏开发的基本流程。 软件环境&#xff1a;Unity 2017.3.0f3&#xff0c;Visual Studio 2013 二、创建新项目 1&#xff0c;启动Unity后将出现一个并列显示Pro…

Springboot 实践(14)spring config 配置与运用--手动刷新

前文讲解Spring Cloud zuul 实现了SpringbootAction-One和SpringbootAction-two两个项目的路由切换&#xff0c;正确访问到项目中的资源。这两个项目各自拥有一份application.yml项目配置文件&#xff0c;配置文件中有一部分相同的配置参数&#xff0c;如果涉及到修改&#xf…

【C++】模拟实现二叉搜索树的增删查改功能

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;C仓库 个人专栏&#xff1a;C专栏 文章目录 一、二叉搜索树的Insert操作&#xff08;非递归&#xff09;分析过程代码求解 二、二叉搜索树的Erase操作&#xff08;非递归&#xff09;分析过程代码求解…

激光焊接汽车尼龙塑料配件透光率测试仪

激光塑性成型技术是近年来塑性加工界出现的一种新技术。通常塑料主要是通过加热加压依赖模具成型。这对于单品种、大批量生产是有效的&#xff1b;而对于各种不同形状的塑料制件则需要昂贵的模具‚装置也较庞大。 高度聚焦的激光束垂直照射在待变形的板料上‚由于塑料直接吸收激…

Zstack 安装 黑群晖未找到硬盘:解决方法

错误原因&#xff1a; 发生错误的原因&#xff0c;黑群晖要求硬盘为Sata格式&#xff0c;而默认创建的硬盘格式为Virtio&#xff0c;我们要做的就是修改挂载的虚拟硬盘改为Sata格式 解决方法&#xff1a; 1、进入 ZStack&#xff0c;找到黑群晖的主机&#xff0c;查看 UUID …

TSINGSEE青犀视频AI算法助力构建城市市容·街面秩序管理解决方案

随着城市化进程加快&#xff0c;未经合理规划设置自然形成的马路市场越来越多&#xff0c;这不仅存在交通安全隐患&#xff0c;也造成了市容秩序混乱&#xff0c;严重影响城市市容面貌。 TSINGSEE青犀AI智能分析网关V3内部部署了几十种算法&#xff0c;包括人脸、人体、车辆、…

Jmeter系列-环境部署、详细介绍、安装目录介绍(1)

环境部署 官网下载Jmeter http://jmeter.apache.org/下载最新版本的 JMeter&#xff0c;解压文件到任意目录 安装JDK&#xff0c;配置Java环境 1、下载&#xff08;注意选择操作系统对应的位数32/64&#xff09; 官网 &#xff1a;http://www.oracle.com 2、安装&#xff0…

实战SpringMVC之CRUD

目录 一、前期准备 1.1 编写页面跳转控制类 二、实现CRUD 2.1 相关依赖 2.2 配置文件 2.3 逆向生成 2.4 后台代码完善 2.4.1 编写切面类 2.4.2 编写工具类 2.4.3 编写biz层 2.4.4 配置mapper.xml 2.4.5 编写相应接口类&#xff08;MusicMapper&#xff09; 2.4.6 处…

JDBC入门到精通-10w总结

JDBC核心技术 笔记是以尚硅谷讲师宋红康JDBC课程为基础&#xff0c;加入自身学习体会&#xff0c;略有修改 第1章&#xff1a;JDBC概述 JDBC是java应用程序和数据库之间的桥梁。JDBC提供一组规范&#xff08;接口&#xff09;。向上是面向应用API&#xff0c;共应用程序使用。向…

jmeter 计数器Counter

计数器可以用于生成动态的数值或字符串&#xff0c;以模拟不同的用户或数据。 计数器通常与用户线程组结合使用&#xff0c;以生成不同的变量值并在测试中应用。以下是计数器的几个常用属性&#xff1a; 变量前缀&#xff08;Variable Name Prefix&#xff09;&#xff1a;定义…

合并到pdf怎么合并?这个方法了解一下

在现代数字化时代&#xff0c;PDF(便携式文档格式)已成为最常用的文件格式之一。PDF文件的优点在于其跨平台兼容性和保持文档格式不变的能力。然而&#xff0c;在某些情况下&#xff0c;我们可能需要知道合并到pdf。无论是为了方便管理、共享或者其他目的&#xff0c;本文将介绍…

GO远程构建并调试

GO远程调试 之前写C&#xff0c;一直习惯了本地IDERemote CMake/GDB编译调试的模式。 因为6.824课程需要用GO&#xff0c;好像没有特别好的支持。记录一下如何配置调试的。 IDE: Goland 操作系统&#xff1a;Windows 远程服务器&#xff1a;Ubuntu 首先配置SSH,让其可以连接到…

【Node.js】Node.js安装详细步骤和创建Express项目演示

Node.js是一个开源的、跨平台的JavaScript运行环境&#xff0c;用于在服务器端运行JavaScript代码。它提供了一个简单的API&#xff0c;可以用于开发各种网络和服务器应用程序。 以下是Node.js的安装和使用的详细步骤和代码示例&#xff1a; 1、下载Node.js 访问Node.js官方…

grpc + springboot + mybatis-plus 动态配置数据源

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 grpc springboot mybatis-plus 动态配置数据源 一. 源码解析1.1 项目初始化1.2 接口请求时候 二. web应用三. grpc应用程序 一. 源码解析 1.1 项目初…