剑指offer刷题笔记--Num51-60

1--数组中的逆序对(51)

主要思路:

        基于归并排序,视频讲解参考:数组中的逆序对

#include <iostream>
#include <vector>class Solution {
public:int reversePairs(std::vector<int>& nums) {if(nums.size() <= 1) return 0;return mergeSort(nums, 0, nums.size() - 1);}int mergeSort(std::vector<int>& nums, int left, int right){if(left >= right) return 0;int mid = left + (right - left) / 2;int count1 = mergeSort(nums, left, mid);int count2 = mergeSort(nums, mid+1, right);int count3 = merge(nums, left, mid, mid+1, right); return count1 + count2 + count3;}int merge(std::vector<int>& nums, int l1, int r1, int l2, int r2){std::vector<int> tmp;int count = 0;int i = l1, j = l2;while(i <= r1 && j <= r2){if(nums[i] > nums[j]){count = count + l2 - i;tmp.push_back(nums[j]);j++;}else{tmp.push_back(nums[i]);i++;}}while(i <= r1){tmp.push_back(nums[i]);i++;} while(j <= r2){tmp.push_back(nums[j]);j++;}for(int i = l1, k = 0; i <= r2; i++, k++){nums[i] = tmp[k];}return count;}};int main(int argc, char *argv[]){std::vector<int> test = {7, 5, 6, 4};Solution S1;int Res = S1.reversePairs(test);std::cout << Res << std::endl;return 0;
}

2--两个链表的第一个公共结点(52)

主要思路:

        两个指针分别指向 A 链表和 B 链表,先让两个指针走完自己的链表,再去走别人的链表,这样两个指针走的总路程是相等的;因此两个指针最终肯定会相遇,相遇的地点要么在结尾(不相交),要么在共有的结点中(相交),只需找到第一个共有的结点即可,此时两个指针指向同一个结点; (所以题目都可以这么浪漫的吗。。。 2023 07 20)

#include <iostream>
#include <vector>struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if(headA == NULL || headB == NULL) return NULL;ListNode *A = headA;ListNode *B = headB;while(A != B){if(A != NULL){A = A->next; // 先走完A}else{A = headB; // 再走B}if(B != NULL){B = B->next; // 先走完B}else{B = headA; //  再走A}}return A; // 走的总路程相等,A最终肯定会和B相遇,要么在NULL(不相交),要么在第一个共同的结点(相交)}
};int main(int argc, char *argv[]){ListNode *Node1 = new ListNode(4);ListNode *Node2 = new ListNode(1);ListNode *Node3 = new ListNode(8);ListNode *Node4 = new ListNode(4);ListNode *Node5 = new ListNode(5);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node5;ListNode *Node6 = new ListNode(5);ListNode *Node7 = new ListNode(0);ListNode *Node8 = new ListNode(1);Node6->next = Node7;Node7->next = Node8;Node6->next = Node3;Solution S1;ListNode *Res = S1.getIntersectionNode(Node1, Node6);std::cout << Res->val << std::endl;return 0;
}

3--在排序数组中查找数字 I(53-I)

主要思路:

        假如数组不是有序的,可以使用哈希,哈希表 key 表示数组的元素,value表示出现的次数,最后只需查询 key 为target对应的个数即可;

#include <iostream>
#include <vector>
#include <map>class Solution {
public:int search(std::vector<int>& nums, int target) {if(nums.size() == 0) return 0;std::map<int, int> hash;for(int i = 0; i < nums.size(); i++){if(hash.find(nums[i]) != hash.end()) hash[nums[i]] += 1;else hash[nums[i]] = 1;}if(hash.find(target) != hash.end()) return hash[target];else return 0;}
};int main(int argc, char *argv[]){std::vector<int> test = {5, 7, 7, 8, 8, 10};int target = 8;Solution S1;int res = S1.search(test, target);std::cout << res << std::endl;return 0;
}

主要思路:

        由于题目是有序的,因此使用二分法查询;

        查找第一个比 target 大的数(右边界 right),查找第一个比 target 小的数(左边界 left),则与target 相同的数目为:right - left - 1;

#include <iostream>
#include <vector>
#include <map>class Solution {
public:int search(std::vector<int>& nums, int target) {if(nums.size() == 0) return 0;int i = 0, j = nums.size() - 1;// 查找右边界while(i <= j){int mid = i + (j - i) / 2;if(target < nums[mid]) j = mid - 1;else i = mid + 1;}int right = i;i = 0;// 查找左边界while(i <= j){int mid = i + (j - i) / 2;if(target <= nums[mid]) j = mid - 1;else i = mid + 1;}int left = j;return right - left - 1;}
};int main(int argc, char *argv[]){std::vector<int> test = {5, 7, 7, 8, 8, 10};int target = 8;Solution S1;int res = S1.search(test, target);std::cout << res << std::endl;return 0;
}

4--0~n-1中缺失的数字(53-II)

主要思路:

        由于数组是有序的,可以使用二分法来查找缺失的数字;

        当 nums[mid] == mid 时,缺失的数字肯定在右区间,执行 i = mid + 1;

        否则执行 j = mid - 1,最后返回左指针即可;

#include <iostream>
#include <vector>class Solution {
public:int missingNumber(std::vector<int>& nums) {int i = 0, j = nums.size() - 1;while(i <= j){int mid = i + (j - i) / 2;if(nums[mid] == mid) i = mid + 1;else j = mid - 1;}return i;}
};int main(int argc, char *argv[]){std::vector<int> test = {0, 1};Solution S1;int res = S1.missingNumber(test);std::cout << res << std::endl;return 0;
}

5--二叉搜索树的第k大结点(54)

主要思路:

        

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

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

相关文章

iOS-Block

Blocks的学习 Block的分类 Block根据其类型可以分为三类&#xff1a; 全局Block&#xff08;NSGlobalBlock&#xff09;栈Block&#xff08;NSMallocBlock&#xff09;堆Block&#xff08;NSStackBlock&#xff09; 而其区分的规则为&#xff1a; 如果没有引用局部变量&…

arping命令 ip地址冲突检测 根据ip查mac地址

arping命令介绍 arping 命令主要用来获取ip对应的mac地址&#xff0c;更新本地arp缓存表。平时主要用来探测ip地址是否冲突即同一个网络里&#xff0c;同一个ip不同mac地址的情况。ip地址冲突将导致网络故障。 arping常用命令参数 arping [参数] ip -U 强制更新邻近主机的a…

记一场面试中遇到的问题

第一题&#xff1a; 简单的字符串拆分、组合的题目。本来题目是很简单&#xff0c;但是里面的一些细节自己没有考虑周全&#xff0c;和面试官在这道题目上讨论了一段时间。后来发现自己把自己差点绕迷糊了&#xff0c;多亏面试官及时提醒。关于技术上的问题还是应该多和别人讨…

关于电脑显示器屏幕看不出灰色,灰色和白色几乎一样无法区分,色彩调整方法

问题&#xff1a; 电脑显示器屏幕看不出灰色&#xff0c;灰色和白色几乎一样无法区分。白色和灰色有色差。 解决方法&#xff1a; 打开“控制面板” ->“色彩管理” ->“高级” ->“校正显示器” 在下一步调节中调成中间这一个实例的样子就可以了 进行微调&#x…

【hadoop】部署hadoop全分布模式

hadoop全分布模式 全分布模式特点部署全分布模式准备工作正式配置hadoop-env.shhdfs-site.xmlcore-site.xmlmapred-site.xmlyarn-site.xmlslaves对NameNode进行格式化复制到另外两台虚拟机启动 对部署是否成功进行测试 全分布模式特点 真正的分布式环境&#xff0c;用于生产具…

【Vue】day02-Vue基础入门

目录 day02 一、今日学习目标 1.指令补充 2.computed计算属性 3.watch侦听器 4.综合案例 &#xff08;演示&#xff09; 二、指令修饰符 1.什么是指令修饰符&#xff1f; 2.按键修饰符 3.v-model修饰符 4.事件修饰符 三、v-bind对样式控制的增强-操作class 1.语法…

边缘检测之loG算子

note // 边缘检测之loG算子&#xff1a;对高斯函数求二阶导数 // G(x,y) exp(-1 * (x*x y*y) / 2 / sigma / sigma) // loG(x,y) ((x*x y*y - 2 * sigma * sigma) / (sigma^4)) * exp(-1 * (x*x y*y) / 2 / sigma /sigma) /* [ 0,0,-1,0,0; 0,-1,-2,-1,0; -1,-2,16,-2…

uni-app实现emoj表情包发送(nvue版)

uni-app实现表情包发送&#xff0c; vue实现思路直接使用grideview网格布局加载emoj表情包即可实现&#xff0c;很简单&#xff0c;但是nvue稍微复杂&#xff0c;这里采用的方案是nvue提供的组件list 看效果 代码 <template><view style"margin-right: 10rpx;m…

Elasticsearch集群状态灯代表含义

了解指示灯状态之前需要先了解下什么是分片和副本。 Sharing(分片、水平扩展) 比如我们的ES集群是3节点的,每个节点最多只能存放300G的文档。当前我们有个大索引有900G,就可以进行分片拆分成3个小索引,每个节点300G,如果我们有10个节点就一个就可以存放一个3T的大索引。…

【Rust 基础篇】Rust Deref Trait 的使用

导言 在 Rust 中&#xff0c;Deref trait 是一种特殊的 trait&#xff0c;用于重载解引用操作符 *。通过实现 Deref trait&#xff0c;我们可以定义类型的解引用行为&#xff0c;使其在使用 * 运算符时表现得像引用类型。 本篇博客将详细介绍 Rust 中如何实现和使用 Deref tr…

C++的static、this和final关键字介绍

C的static、this和final关键字介绍 ☆static关键字&#xff1a;static可以用于不同的上下文&#xff0c;其主要作用如下&#xff1a; 在类中&#xff0c;static成员表示类的静态成员&#xff0c;即属于整个类而不是类的实例。静态成员可以被所有该类的对象所共享&#xff0c;且…

如何使用自有数据微调ChatGLM-6B

构建自己的数据集 数据格式&#xff1a;问答对 官网例子 ADGEN 数据集任务为根据输入&#xff08;content&#xff09;生成一段广告词&#xff08;summary&#xff09;。 { "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖…

3.8 Bootstrap 面包屑导航(Breadcrumbs)

文章目录 Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; 面包屑导航&#xff08;Breadcrumbs&#xff09;是一种基于网站层次信息的显示方式。以博客为例&#xff0c;面包屑导航可以显示发布日期、类别或…

Stable Diffusion + EbSynth + ControlNet 解决生成视频闪烁

一、安装 1.1、安装ffmpeg 下载地址&#xff1a; 解压&#xff0c;配置环境变量 E:\AI\ffmpeg\bin 检查是否安装成功 1.2、安装SD的 EbSynth 插件 插件地址 https://github.com/s9roll7/ebsynth_utility 报错&#xff1a;ModuleNotFoundError: No module named extension…

【广州华锐互动】AR远程巡检系统在设备维修保养中的作用

随着科技的不断发展&#xff0c;AR(增强现实)远程巡检系统在设备检修中发挥着越来越重要的作用。这种系统可以将AR技术与远程通信技术相结合&#xff0c;实现对设备检修过程的实时监控和远程指导&#xff0c;提高设备检修的效率和质量。 首先&#xff0c;AR远程巡检系统可以帮助…

单片机尽力少用位域操作

1、在51单片机中少用uint32_t类型&#xff0c;查看汇编真的好多条指令&#xff0c;尽力避免少用。 2、在32位单片机中&#xff0c;u8、u16、u32类型操作起来基本没有什么影响&#xff0c;下图是我做的测试&#xff0c;可能测试不全面&#xff0c;按照当前测试&#xff0c;在32…

35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…

无向图 遍历

文章目录 无向图dfn 记录 无向图 每个节点到其它节点的方向不确定&#xff0c;所以如果只按照方向遍历&#xff0c;可能会造成相互指向的死循环 dfn 记录 通过一个记录表&#xff0c;初始每个节点代表的数值是0&#xff0c;每遍历一个节点就让数值1&#xff0c;遍历过程中只…

Kubernetes_1.27.3_Harbor结合Nacos实战

Nacos 实战 作者:行癫(盗版必究) 一:Nacos简介 1.简介 ​ Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台;Nacos 致力于帮助您发现、配置和管理微服务;Nacos 提供了一组简单易用的特…

实战 ➾【Red Hat 搭建部署VSFTPd服务】

实战 ➾【Red Hat 搭建部署VSFTPd服务】 &#x1f53b; 前言&#x1f53b; 一、vsFTPd服务部署&#x1f6a5; 1.1 vsFTPd服务安装&#x1f6a5; 1.2 vsFTPd服务的启动与关闭 &#x1f53b; 二、vsFTPd相关配置&#x1f6a5; 2.1 vsFTPd的相关配置文件&#x1f6a5; 2.2 配置匿名…