当前位置: 首页 > 科技观察

哈希表、快速排序和二分查找:两数之和

时间:2023-03-16 21:22:11 科技观察

大家好,我是小风。我在这个公众号写了很多关于计算机底层方向的文章。应众多读者的要求,我们从这篇文章开始一个新的系列:数据结构与算法,原来计算机底层的方向会持续更新。数据结构与算法系列前期以LeetCode题解为例进行讲解。当达到一定量后,总结出程序员必备的算法思想和数据结构知识。这个系列的目的就是让你了解和学习是的,我会写。也欢迎大家在留言区报名,准备春招的同学可以一起报名。废话不多说,开始今天的正题。这是LeetCode数据结构与算法刷题系列的第一篇文章。今天的主题是两个数的和。题目是这样的:给定一个整型数组和一个target,在数组中找到和等于target的两个数,并返回这两个数的下标。例子:数组nums=[2,7,11,15],target=9,则输出[0,1],因为nums[0]+nums[1]==9题不难,而且有很多解决方法,我们依次来看一下。任何话题都可以从最简单的方式开始思考。以下代码均为C++。暴力解法我们先固定一个数,比如第一个数2,然后遍历后面的元素,判断和是否等于9,如果是就记录下来,如果不是就看下一个数,即7.最后的代码很简单。时间复杂度为O(n^2):vectortwoSum(vector&nums,inttarget){vectorres;for(inti=0;itwoSum(vector&nums,inttarget){unordered_map地图;矢量资源;for(inti=0;isecond);}}returnres;}显然,这个算法的时间复杂度是O(n),因为一般情况下,可以认为哈希表可以找到复杂度为常量的元素。你是不是觉得很简单?注意这里用到了map容器,那么如果面试官让你不要用这种已经写好的库怎么办?我们在文章开头就分析过了,其实这本质上是一个搜索问题。既然是搜索问题,那么解决这个问题的另一种方法就是排序。只要排序好,剩下的就简单了。二分查找自然是有序查找问题的好帮手。所以接下来的思路就是排序加二分查找。引入了排序加二分查找的思想。接下来我们手写快速排序,但是我们排谁呢?注意,标题需要返回元素下标,所以排序时,除了数组元素外,还需要包含下标。voidquick_sort(vector>&nums,intb,inte){如果(b>e)返回;整数i=b-1;对于(intk=b;k>&nums,intb,inte,inttarget){while(b<=e){intm=(b+e)/2;如果(nums[m].second==target){returnnums[m].first;}elseif(nums[m].secondtwoSum(vector&nums,inttarget){vectorres;向量<对>nums_index;intsize=nums.size();for(inti=0;i(i,nums[i]));}quick_sort(nums_index,0,size-1);for(inti=0;i