OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)

目录

 ​编辑

 1.题目描述

2.C语言中的内置排序函数(qsort)

3.解题思路

3.1 升序

3.2双指针的移动

 3.3 保证加入元素的唯一性

4.leetcode上的完整代码

完结散花


 

                                            悟已往之不谏,知来者犹可追                                                        

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~ 

 1.题目描述

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。请你找出数组中的最大元素并检查它是否 至
少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。
OJ链接【 leetcode 题号:747. 至少是其他数字两倍的最大数】【难度:简单】
示例:
输入:nums = [3,6,1,0]
输出:1
解释:6 是最大的整数,对于数组中的其他整数,6 大于数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。
输入:nums = [1,2,3,4]
输出:-1
解释:4 没有超过 3 的两倍大,所以返回 -1 。
输入:nums = [1]
输出:0
解释:因为不存在其他数字,所以认为现有数字 1 至少是其他数字的两倍

349. 两个数组的交集 - 力扣(LeetCode)题目链接放这里啦~

2.C语言中的内置排序函数(qsort)

在讲解题目之前我想和宝子们分享一个C语言中的内置排序函数~  举个栗子啦~

/* qsort example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */int values[] = { 40, 10, 100, 90, 20, 25 };int compare (const void * a, const void * b)
{return ( *(int*)a - *(int*)b );
}int main ()
{int n;qsort (values, 6, sizeof(int), compare);for (n=0; n<6; n++)printf ("%d ",values[n]);return 0;
}

                                             

3.解题思路

3.1 升序

这道题很明显是用哈希数组来做,但如果我们没有学哈希表的话,或者我们是否还有其他的方法来解题呢~

之前我们就知道对于无序的数组,当我们对其进行排序后,问题都会变得更加简单呢~

没有例外,我们现将这俩个数组进行有序化处理

int intCmp (const void * a, const void * b)
{return ( *(int*)a - *(int*)b );
}qsort(nums1, nums1Size, sizeof(int), intCmp);qsort(nums2, nums2Size, sizeof(int), intCmp);*returnSize = 0;//要返回数组的大小先初始化为零int index1 = 0,;//记录数组一的下标int index2 = 0;//记录数组二的下标//创建一个最大的数组来存放相同的元素int* returnNums = malloc(sizeof(int) * (nums1Size + nums2Size));

3.2双指针的移动

 然后我们有俩个指针分别指向数组nums1中的第一个元素和nums2的第一个元素~

要求俩个数组的交集,那我们就要找俩个数组当中相同的元素~

所以我们就要一一比较俩个数组中的元素,那我们怎么比较呢~

我们先比较俩个指针指向的第一个元素,如果相同双指针就同时向后移动,并把相同元素存放到数组returnNums中,如果不相同,则哪个指针指向的元素小,哪个指针就向后移动后继续比较

算法的图示在下面啦~

 这部分的代码如下啦~

    //两个都小于数组长度才去遍历while (index1 < nums1Size && index2 < nums2Size){if (nums1[index1] == nums2[index2]) {returnNums[(*returnSize)++] = nums1[index1];index1++;index2++;} else if (nums1[index1] < nums2[index2]) index1++;else index2++;}

 3.3 保证加入元素的唯一性

注意:我们还要确保加入returnNums中元素的唯一性!

所以我们还要加上一个判断条件~

if(!*(returnSize)||nums1[index1]!=returnNums[*(returnSize)-1])returnNums[(*returnSize)++] = nums1[index1];

 !*(returnSize)表示当(*returnSize)=0(即表示假)把他转换成为真以此来应对当数组中还没有存放元素是的情况

4.leetcode上的完整代码


int intCmp (const void * a, const void * b)
{return ( *(int*)a - *(int*)b );
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) 
{qsort(nums1, nums1Size, sizeof(int), intCmp);qsort(nums2, nums2Size, sizeof(int), intCmp);*returnSize = 0;//要返回数组的大小先初始化为零int index1 = 0;//记录数组一的下标int index2 = 0;//记录数组二的下标//创建一个最大的数组来存放相同的元素int* returnNums = malloc(sizeof(int) * (nums1Size + nums2Size));//两个都小于数组长度才去遍历while (index1 < nums1Size && index2 < nums2Size){if (nums1[index1] == nums2[index2]) {if(!*(returnSize)||nums1[index1]!=returnNums[*(returnSize)-1])returnNums[(*returnSize)++] = nums1[index1];index1++;index2++;} else if (nums1[index1] < nums2[index2]) index1++;else index2++;}return returnNums;
}

5.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

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

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

相关文章

(十七)springboot实战——spring securtity的授权流程源码解析

前言 本节内容是关于spring security安全框架授权流程的源码分析&#xff0c;spring security的授权流程主要是在FilterSecurityInterceptor过滤器中实现的。我们会通过源码层级的分析&#xff0c;了解清楚spring security的底层是如何实现用户授权的。 正文 1.配置一个请求…

【数据结构】一篇文章带你学会八大排序

一、排序的概念1. 排序的使用&#xff1a;2. 稳定性&#xff1a;3. 内部排序&#xff1a;4. 外部排序︰5. 排序的用途&#xff1a; 二、排序的原理及实现1. 插入排序1.1 直接插入排序1.1.1 直接插入排序在现实中的应用1.1.2 直接插入排序的思想及个人理解1.1.3 直接插入排序的排…

c入门第十篇——指针入门

一句话来说: 指针就是存储了内存地址值的变量。 在前面讨论传值和传址的时候&#xff0c;我们就已经开始使用了指针来传递地址。 在正式介绍指针之前&#xff0c;我们先来简单了解一下内存。内存可以简单的理解为一排连续的房子的街道&#xff0c;每个房子都有自己的地址&#…

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…

SSH口令问题

SSH&#xff08;Secure Shell&#xff09;是目前较可靠、专为远程登录会话和其他网络服务提供 安全性的协议&#xff0c;主要用于给远程登录会话数据进行加密&#xff0c;保证数据传输的安全。 SSH口令长度太短或者复杂度不够&#xff0c;如仅包含数字或仅包含字母等时&#xf…

【Python4Delphi】学习笔记(一):介绍篇

一、前言&#xff1a; 1. python语言简介&#xff1a; 众所周知&#xff0c;python是目前非常流行的编程语言之一&#xff0c;自20世纪90年代初Python语言诞生至今&#xff0c;它已被逐渐广泛应用于系统管理任务的处理和Web编程。 由于Python语言的简洁性、易读性以及可扩展性…

【深度学习:SegGPT】在上下文中分割所有内容 [解释]

【深度学习&#xff1a;SegGPT】在上下文中分割所有内容 [解释] SegGPT与以前的模型相比如何&#xff1f;SegGPT在实践中是如何工作的&#xff1f;SegGPT培训计划上下文着色上下文集成上下文调整SegGPT 训练参数 如何尝试 SegGPT&#xff1f;使用哪些数据集来训练 SegGPT&#…

mac终端怎么恢复初始设置?图文教程不想看看吗?

某网友说“不小心把终端弄成了这样&#xff1f;请问该怎么办呢&#xff1f;mac终端怎么恢复初始设置&#xff1f;” 其实&#xff0c;这个问题不难&#xff0c;在终端中选择【还原初始值】即可。 Mac终端初始化具体怎么操作&#xff1f;话不多说&#xff0c;图文教程分享给大…

【Java】MybatisPlus入门

学习目标 能够基于MyBatisPlus完成标准Dao开发 能够掌握MyBatisPlus的条件查询 能够掌握MyBatisPlus的字段映射与表名映射 能够掌握id生成策略控制 能够理解代码生成器的相关配置 一、MyBatisPlus简介 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤&#xff1f; 1.1 Sp…

Spring + Tomcat项目中nacos配置中文乱码问题解决

实际工作的时候碰到了nacos中文乱码的问题&#xff0c;一顿排查最终还是调源码解决了。下面为具体的源码流程&#xff0c;有碰到的可以参考下。 对于nacos配置来说&#xff0c;初始主要源码就在NacosConfigService类中。里面有初始化获取配置content以及设置对应监听器的操作。…

猫头虎分析:如何利用ChatGPT及生成式AIGC提高工作效率 ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

npm 上传一个自己的应用(1) 搭建一个项目环境

上文 在npm官网中注册一个账号并登录 带着大家创建了一个npm账号 我们先登录官网 然后 我们在自己电脑中创建一个文件夹 这个文件夹叫什么没有太大所谓 我这里直接叫 grnpmtext 然后 我们在这个文件夹中初始化一个项目 终端输入 npm initpackage name 要我们输入项目的名称 …