剑指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.mfbz.cn/a/39278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb 前后端分离

AJax 1. 前端视图 ajax\src\main\webapp\ajax-register.html <html><head><meta charset"UTF-8"> </head><body><form class"form-horizontal" role"form"><div><tr><td>账号</td&…

6款好用的在线原型图设计工具推荐

在线原型图的核心功能是可视化需求&#xff0c;因此一个易于使用的在线原型图工具对原型图设计至关重要。对于熟悉的Photoshop和iIlustrator来说&#xff0c;虽然它们功能强大&#xff0c;但界面太复杂&#xff0c;初学者很难快速启动&#xff0c;面对批量调整的在线原型图&…

Allegro过孔盖油和过孔开窗设置(部分过孔开窗)

Allegro设置一部分过孔盖油&#xff0c;另一部分过孔开窗。 过孔开窗&#xff1a;过孔部分去除阻焊&#xff0c;便于调试和散热&#xff1b; 过孔盖油&#xff1a;过孔盖上阻焊油墨&#xff0c;防止过孔连锡短路。 总结 使用pad designer设计两种via pad&#xff0c;一种不开…

STM32案例学习 GY-39环境监测传感器模块

STM32案例学习 GY-39环境监测传感器模块 硬件平台 野火STM32F1系列开发板正点STM32F1系列开发板STM32F103ZET6核心板GY-39环境监测传感器模块 GY-39环境监测传感器模块 GY-39 是一款低成本&#xff0c;气压&#xff0c;温湿度&#xff0c;光强度传感器模块。工作电压 3-5v…

【JavaEE】HTTP请求的构造

目录 1、通过form表单构造HTTP请求 2、通过JS的ajax构造HTTP请求 3、Postman的安装和简单使用 常见的构造HTTP请求的方式有一下几种&#xff1a; 直接通过浏览器的地址栏&#xff0c;输入一个URL&#xff0c;就可以构造一个GET请求HTML中的一些特殊标签&#xff0c;也会触发…

网工内推 | 美图秀秀招网工,大专以上,15薪,NP认证优先

01 美图公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、美图大厦网络、分公司网络、IT相关项目的网络、办公内网服务器&#xff1b; 2、负责网络的设计、运行、管理和维护等工作&#xff1b; 3、负责远程办公环境的优化、运行、管理和维护工作&#xff1b; 4、…

二级市场负重前行?腾讯音乐的“新伤”与“旧患”

炎炎夏日的7月&#xff0c;于腾讯音乐&#xff08;NYSE:TME、HK:01698&#xff09;而言并不太平。 先是&#xff0c;在7月5日&#xff0c;企鹅FM发布官方公告称由于业务调整&#xff0c;将于9月6日正式停止运营。 仅过十二天&#xff0c;7月17日&#xff0c;腾讯音乐发布公告&…

勒索花样繁多,“Sophos Encrypt”披马甲进行勒索攻击

近日&#xff0c;网络安全供应商Sophos发表声明&#xff0c;称Sophos被一款名为“Sophos Encrypt”新型勒索软件冒充&#xff0c;该勒索软件进行攻击时会冒用Sophos品牌名称&#xff0c;并将用户重要文件进行加密以勒索赎金。 现在的勒索软件类型多样&#xff0c;令企业防不胜防…

Windows搭建Nginx实现RTMP转为HLS流

所需软件 nginx-1.7.11.3-Gryphon&#xff08;这个包含必须的RTMP模块&#xff0c;普通的Ngxin没有这个&#xff09;ffmpegVLC 配置Nginx 1为Nginx配置RTMP和HLS 这里定义了一个叫live的RTMP路径。同时设置其开启HLS功能&#xff0c;那么所有推送到这个地址的RTMP流都会自动生…

【Apifox】国产测试工具雄起

在开发过程中&#xff0c;我们总是避免不了进行接口的测试&#xff0c; 而相比手动敲测试代码&#xff0c;使用测试工具进行测试更为便捷&#xff0c;高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman&#xff0c;他还拥有一个非常nb的功能&#xff0c; 在接…

编程小白的自学笔记九(python爬虫入门+代码详解)

系列文章目录 编程小白的自学笔记八&#xff08;python中的多线程&#xff09; 编程小白的自学笔记七&#xff08;python中类的继承&#xff09; 编程小白的自学笔记六&#xff08;python中类的静态方法和动态方法&#xff09; 编程小白的自学笔记五&#xff08;Python类的…

Navicat分配子用户及权限管理

一、创建用户&#xff0c;分配权限 新建用户 输入要创建的子用户的信息 主机名 表示访问本服务的方式&#xff0c;%表示即可以本机访问&#xff0c;也可以远程访问 之后&#xff0c;我们给创建的用户分配权限&#xff08;在该数据库的可操作空间&#xff09; 为用户分配增删改…

SPEC CPU 2017 1.0.5 不同版本CentOS 7 8 安装笔记

CentOS 7.9.2009 x86_64 gcc版本 安装成功 runcpu编译报错 gcc版本太低&#xff0c;不识别-fno-tree-loop-vectorize 去掉config/gcc.cfg中 -fno-tree-loop-vectorize编译优化参数。 用例编译中 CentOS 8.3.2011 x86_64 gcc版本 安装失败&#xff0c;需要自行编译tools 手动…

Visual Studio 自定义的颜色字体不生效

问题描述&#xff1a; 1、dll1中引用第三方库的类不识别&#xff0c;颜色黑白&#xff0c;自定义颜色不生效&#xff1b;定义的是结构体 2、在dll2引用另一个dll1中的结构体。结构体不识别&#xff0c;今天成员函数cpp中自定义颜色不生效。 问题解决方式&#xff1a; 全部清…

黑客学习笔记(自学)

一、首先&#xff0c;什么是黑客&#xff1f; 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手&#xff0c;现阶段黑客所需要掌握的远远不止这些。 二、为什么要学习黑客技术&#xff1f; 其实&#xff0c;网络信息空间安全已经成为海陆空之外的第四大战场&#xff0c;除了国…

抖音账号矩阵系统源码-开源部署开发者分享

抖音账号矩阵系统&#xff0c;短视频账号矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员…

vue+element Cascader 级联选择器 > 实现省市区三级联动

vueelement Cascader 级联选择器 > 实现省市区三级联动 先看下实现效果吧&#xff08;嘻嘻&#xff09; 看完我们就开始啦 安装element-china-area-data1 npm install element-china-area-data5.0.2 -S上代码 <el-cascadersize"large":options"options…

腾讯、飞书等在线表格自动化编辑--python

编辑在线表格 一 目的二 实现效果三 实现过程简介1、本地操作表格之后进入导入在线文档2、直接操作在线文档 四 实现步骤讲解1、实现方法的选择2、导入类库3、设置浏览器代理直接操作已打开浏览器4、在线文档登录5、在线文档表格数据操作6、行数不够自动添加行数 五 代码实现小…

数据采集专家----4通道AD采集子卡推荐

FMC136是一款4通道250MHz采样率16位AD采集FMC子卡&#xff0c;符合VITA57规范&#xff0c;可以作为一个理想的IO模块耦合至FPGA前端&#xff0c;4通道AD通过高带宽的FMC连接器&#xff08;HPC&#xff09;连接至FPGA从而大大降低了系统信号延迟。 该板卡支持板上可编程采样时钟…

css 禁止多次点击导致的选中了目标div的文字

像下面这样的情况&#xff0c;就可以用这种方法避免掉 禁止多次点击&#xff0c;导致的&#xff0c;选中了目标div的文字 或者 禁止多次点击&#xff0c;导致&#xff0c;html结构被选中显示出来 .targetDiv {-webkit-user-select: none;-moz-user-select: none;-ms-user-sel…
最新文章