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

2024-02-08 23:52

本文主要是介绍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.完结散花

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

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

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

我们下期不见不散~~

这篇关于OJ刷题:求俩个数组的交集(没学哈希表?快排双指针轻松搞定!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692577

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA