寻找两个正序数组的中位数K个一组翻转链表

news2024/9/30 17:40:28

文章目录

      • 1. [寻找两个正序数组的中位数](https://leetcode.cn/problems/median-of-two-sorted-arrays/)
      • 2. [K个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/)

1. 寻找两个正序数组的中位数

首先,
中位数的作用就是将正序数组的两端进行分割, 假设A数组的数目是m,B数组中元素个数是n个, 如果合并之后的数组数目是偶数,左右的数组个数是相同的并且满足left_max<right_min, 中位数就是 (left_max+right_min)/2 如果合并之后的数组数目是奇数,我们让左边的比右边的多一个, 中位数就是左边的最大值,也就是多出来的那一个left_max。

其次,
在A组的任意位置i将数组切开,i属于[0,m],A被分为两部分[0,i-1],[i,m] 在B组的任意位置j将数组切开,j属于[0,n],B被分为两部分[0,j-1],[j,n] 这样合并之后,left_A+left_b=right_A+right_B; (当为偶数时)即i+j=m-i+n-j; (当为奇数时)即i+j-1=m-i+n-j; 所以i+j=(m+n)/2 或者 i+j=(m+n+1)/2,而这两个的值相同, 得到i和j之间的关系函数式,j=(m+n+1)/2-i;

然后,
我们知道i∈[0,m],j∈[0,n];如果m>n,也就是A的长度更长的话,函数式中的j<0就没有意义了 所以我们规定m<n,如果存在m>n,我们就将两个数组交换一下,始终保持m<n,保证我们表达式中的j始终有意义;

最后,
因为都是正序数组,所以我们只需要寻找在[0,m]中寻找i的位置 保证B[j-1]<=A[i]并且A[i-1]<B[j],其中j=(m+n+1)/2, i逐渐增大,j逐渐减小,j还得大于0.所以一定存在i的最大值使得A[i-1]<=B[j]; i是最大值,那么第i+1个位置A[i]>B[j],因为B组也是正序数组B[i]>B[i-1], 所以我们直接推出B[i-1]<A[i]在满足A[i-1]<=B[j]的条件之下, 所以我们最后的工作只需要找i的最大值保证A[i-1]<=B[i];即可
具体细节在代码注释中:
注意:
假设 A[i−1],B[j−1],A[i],B[j]A[i−1],B[j−1],A[i],B[j] 总是存在, 对于 i=0、i=m、j=0、j=n 这样的临界条件, 我们只需要规定 A[−1]=B[−1]=−∞,A[m]=B[n]=∞ 即可,这样不影响前后排序。

  • 代码如下:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) 
{
	//为了保证表达式中的j>=0,约定m<n 
	if(nums1.size()>nums2.size())
		return findMedianSortedArrays( nums2, nums1);

	int m=nums1.size();
	int n=nums2.size();
	int left=0,right=m;
	int l_max=0,r_min=0;

	while(left<=right)
	{
		//采用二分查找的方式解决时间复杂度的问题log(min(m,n))
		int i=(left+right)/2;
		int j=(m+n+1)/2-i;//我们自己的表达式
		//nums[-1]=-∞ nums[m]=+∞
		int nums_i1=(i==0?INT_MIN:nums1[i-1]);
		int nums_i=(i==m?INT_MAX:nums1[i]);
		int nums_j1=(j==0?INT_MIN:nums2[j-1]);
		int nums_j=(j==n?INT_MAX:nums2[j]);
		//假定在nums1[i-1],nums2[j]处分割线
		//为的就是找到最大的i使得满足A[i-1]<=B[j]
		//那样的话,B[j-1]<=A[i]必然成立
		if(nums_i1<=nums_j)
		{
			l_max=max(nums_i1,nums_j1);
			r_min=min(nums_i,nums_j);

			left=i+1;
		}
		else
		{
			right=i-1;
		}
	} 
	return (m+n)%2==0?(l_max+r_min)/2.0:l_max;
}

2. K个一组翻转链表

K个一组翻转链表,可以通过K找到这一组的首尾指针,然后通过子函数完成一个一组的翻转,然后返回首尾指针,接着指向下一组需要翻转的链表,主要就是首尾指针的控制和单个链表的翻转。

  • 理解翻转一个一组的链表如下图:
    在这里插入图片描述
  • 理解翻转完一次之后向后找下一组中指针的变化
    在这里插入图片描述- 代码如下:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    pair<ListNode* ,ListNode*> reverseOneList(ListNode* head,ListNode* tail)
    {
       ListNode* prev=tail->next;
       ListNode* p=head;
       while(tail!=prev)
       {
            ListNode* next=p->next;
            p->next=prev;
            prev=p;
            p=next;
       }
       return {tail,head};
    }
    
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* hair=new ListNode(0);
        hair->next=head;
        ListNode* prev=hair;
        while(head)
        {
            ListNode* tail=prev;
            for(int i=0;i<k;i++)
            {
                tail=tail->next;
                if(!tail)
                {
                    return hair->next;
                }
            }

            ListNode* next=tail->next;
            pair<ListNode* ,ListNode*> result=reverseOneList(head,tail);
            head=result.first;
            tail=result.second;
						//重新确立连接关系
            prev->next=head;
            tail->next=next;
            //指针向后移动进行下一组的指针寻址
            prev=tail;
            head=tail->next;
        }
        return hair->next;
    }
};

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

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

相关文章

[内网渗透]—权限维持

Skeleton Key(万能密码) 原理 当拿到域控权限后,使用mimikatz可以注入Skeleon Key,将 Skeleton Key 注入域控制器的 lsass.exe 进程,这样会在域内的所有账号中添加一个 Skeleton Key,而这个key是自己设定的所以可以随时共享访问。 PS:由于注入到lsass.exe进程中,所以每…

JS图解 | Java程序员的JS | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘JS 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出并回答了…

跟腾讯架构大师学网络框架与后台架构

目录 跟腾讯架构大师学网络框架与后台架构 单机服务 1、单机服务&#xff1a;基本概念 2、单机服务&#xff1a;同步阻塞​编辑 3、单机服务&#xff1a;异步非阻塞框架 4、单机服务&#xff1a;典型框架&#xff1a; 5、单机服务&#xff1a;协程框架 6、单机服务&…

Spring之自定义Bean何时被扫描注册?

1. 前言 在AnnotationConfigApplicationContext的构造函数里&#xff0c;Spring会创建AnnotatedBeanDefinitionReader对象&#xff0c;它的基本作用是将基于注解的BeanClass封装成BeanDefinition&#xff0c;并注册到BeanFactory中。同时AnnotatedBeanDefinitionReader的构造函…

计算机毕业设计springboot+vue景区疫情预警系统

项目介绍 本景区疫情预警系统是针对目前景区疫情预警的实际需求,从实际工作出发,对过去的景区疫情预警系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结…

垃圾回收器

文章目录1. 垃圾回收器分类2. 不同垃圾回收器概述3. Serial与Serial Old垃圾回收器&#xff1a;串行回收4. ParNew垃圾回收器&#xff1a;并行回收5. Parallel与Parallel Old垃圾回收器&#xff1a;吞吐量优先6. CMS回收器&#xff1a;低延迟7. G1回收器&#xff1a;区域分代式…

web前端-javascript-初识Array数组(说明,初步创建,添加元素和读取元素,获取和修改数组的 length 长度,最后一个位置添加元素)

初识 Array 数组 1. 说明 数组也是一个对象它和普通的对象功能类似&#xff0c;也是用来存储一些值的不同的是普通对象是使用字符串作为属性名的 而数组是使用数字来作为索引来操作元素 索引&#xff1a; 从 0 开始的整数就是索引 数组的存储性能比普通对象要好&#xff0c;在…

【记录】Ubuntu20.04安装CUDA和cuDNN

本文记录下如何在Ubuntu20.04系统中安装CUDA和cuDNN。 这里简要介绍下CUDA和cuDNN分别是什么。CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型。它通过利用图形处理器 (GPU) 的处理能力&#xff0c;可大幅提升计算性能&#xff1b;cuDNN(深度神经网络库)是GPU加速的用于深度…

《西西弗神话》笔记——不期待人生可以过得很顺利,但我希望碰到人生难关的时候,自己可以是它的对手

目录 一、作者生平 二、经典摘录 1、悲剧从本质上讲是对苦难的反抗 2、自杀实质上是一种逃避&#xff0c;它是反抗的对立面 3、不是否认生活本身 4、书的宗旨就是要讨论荒谬与自杀的关系 5、真正严肃的哲学问题只有一个&#xff1a;自杀 6、了解人是否能够义无反顾地生…

【2022.12.16】备战春招Day11——每日一题 + 142. 环形链表 II + 93. 复原 IP 地址

【每日一题】 1785. 构成特定和需要添加的最少元素 题目描述 给你一个整数数组 nums &#xff0c;和两个整数 limit 与 goal 。数组 nums 有一条重要属性&#xff1a;abs(nums[i]) < limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的最少元素数量 &#xff0c;添…

SQL语句练习05

目录 一、建表并插入数据 二、查询语句练习 一、建表并插入数据 一、建立如下 &#x1d446; 表(命名格式“姓名拼音_三位学号_week7s”&#xff0c;如LBJ_023_week7s&#xff09;&#xff0c;并插入数据 create table LYL_116_week7s(SNO varchar(3),SNAME varchar(10), CI…

【数据结构Java版】Stack栈的妙用

目录 一、栈的概念 二、栈的使用 &#xff08;1&#xff09;主要方法 &#xff08;2&#xff09;实例演示 三、栈的模拟实现 四、栈相关练习题 &#xff08;1&#xff09;有效的括号 &#xff08;2&#xff09;栈的压入、弹出序列 &#xff08;3&#xff09;逆波兰表达…

SpringBoot中mapper-locations配置多个mapper包路径

1 问题描述 大家都知道mapper-locations是配置mapper路径的&#xff0c;但是有时候mapper路径可能不止一个 比如说有两个包A和B&#xff0c;A和B里面的业务模块不同就需要写各自的mapper&#xff0c;这时候如果只配置A的mapper路径&#xff0c;那么B的mapper路径肯定扫码不到…

无法打开jupyter notebook

无法打开jupyter notebook遇到的问题问题分析tornado什么是tornado?如何更新tornado问题解决解决方法一解决方法二参考资料遇到的问题 今天打开anaconda prompt的时候想要打开jupyter notebook,但是遇到的了如下报错: Traceback (most recent call last): File “C:\ProgramD…

C++ Reference: Standard C++ Library reference: Containers: map: multimap: begin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/multimap/begin/ 公有成员函数 <map> std::multimap::begin C98 iterator begin(); const_iterator begin() const; C11 iterator begin() noexcept; const_iterator begin() const noexcept;返回指向开…

python tkinter实现文本编辑器

题目 请设计并实现一款文本编辑器。程序允许用户打开、保存文本文件。 例如&#xff1a; 在用户打开文件时&#xff0c;会呈现打开文件对话框&#xff0c; 在用户保存文件时&#xff0c;会呈现保存为对话框 当打开文件出错时&#xff0c;程序不会崩溃&#xff0c;而是会提示…

【Python】CSV,TSV语料读取的简单操作——内建包csv的使用

背景 在做文本相关的任务时&#xff0c;难免会遇见csv&#xff0c;tsv等格式的数据&#xff0c;但有时只是读取&#xff0c;然后传入到下一个任务中而已&#xff0c;并不会做过多的操作。在这种情况下&#xff0c;可以使用pandas读取&#xff0c;但是难免有些臃肿&#xff0c;…

切记不要接受任何降薪,不要同意任何调岗,更不要害怕HR威胁背调,跟HR聊天都要录音!...

最近很多人都遭遇了裁员和降薪&#xff0c;一位网友给大家提出了几点建议&#xff1a;1.不要接受任何降薪&#xff0c;不要签字同意。如果公司敢降薪就直接去仲裁&#xff0c;但如果签字之后&#xff0c;降薪就属于你情我愿了。2.不要签字同意调岗&#xff0c;调岗会不会有薪水…

【博客559】更出色的网络监控采集方案---Telemetry(遥测技术)

网络监控方案—Telemetry(遥测技术) 1、几种不同采集方式对比&#xff1a;CLI&#xff0c;SNMP&#xff0c;SYSLOG&#xff0c;Telemetry CLI&#xff1a; 作为应用最广使用最久的网络监控技术&#xff0c;最大的问题就是兼容性&#xff0c;同类产品不同厂商之间的兼容性&…

web前端-javascript-创建Array数组和元素类型(字面量创建,构造函数创建,元素可以是任意数据类型,二维数组)

文章目录创建 Array 数组1. 普通方法2. 使用字面量来创建数组3. 使用构造函数来创建数组数组的元素类型1. 创建一个长度为 10 的数组2. 数组中的元素可以是任意的数据类型2.1. 数组中的元素也可以是对象2.2. 也可以是一个函数2.3. 数组中也可以放数组,如下这种数组我们称为二维…