前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数组问题-LeetCode1、4(哈希表、归并排序)

数组问题-LeetCode1、4(哈希表、归并排序)

作者头像
算法工程师之路
发布2019-09-12 15:20:32
4050
发布2019-09-12 15:20:32
举报

作者:TeddyZhang

公众号:算法工程师之路

数组问题LeetCode #1 #4

编程题

【LeetCode #1】两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

解题思路:

这个题目使用哈希表可以将算法优化到O(n), 这里面我们只需要遍历一遍哈希表,有一个优化的思路,就是哈希表边创建边查找。其中键值key为数组nums的元素,而value为数组nums的元素的索引。因此当我们遍历到nums[i]时,我们就需要去哈希表中查找target-nums[i],从而得到其索引,因此res将i和hashmap[target-nums[i]]放入数组中!

CPP源码

代码语言:javascript
复制
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashmap;
        vector<int> res;
        for(int i = ;i < nums.size();i++){
            if(hashmap.count(target-nums[i]) > ){   
                // 比使用hashmap.find(target-nums[i] != hashmap.end())快一点
                res.push_back(hashmap[target-nums[i]]);
                res.push_back(i);
                return res;
            }
            hashmap[nums[i]] = i;
        }
        return res;
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum/

【LeetCode #4】寻找两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组nums1nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

nums1 = [1, 3] nums2 = [2]

则中位数是 2.0 示例 2:

nums1 = [1, 2] nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

解题思路: 比较简单的思路使用归并排序,为什么有这个思路呢?因为题目说两个数组是有序数组,因此我们对两个数组进行merge,如果小的数则放入res数组中,直到res的数组大小为(m*n)/2+1,因此最后在总个数为偶数时,中位数为res中最后两个数求平均,否则中位数为res数组中最后一个数。

至于O(log(m+n))的方法,大家可以看官方题解,此处不再赘述!!!

代码语言:javascript
复制
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> res;
        int m = nums1.size(), n = nums2.size();
        int mid = (m + n) /  + ;
        int i, j;
        for(i = , j = ;i <m && j < n;){
            if(nums1[i] > nums2[j]){
                res.push_back(nums2[j++]);
            }
            else if(nums1[i] <= nums2[j]){
                res.push_back(nums1[i++]);
            }
            if(res.size() == mid){
                break;
            }
        }
        while(res.size() != mid){
            if(i < m)
                res.push_back(nums1[i++]);
            if(j < n)
                res.push_back(nums2[j++]);
        }

        int len = res.size();
        if((m + n) %  == )
            return (res[len-1] + res[len-2]) / 2.0;
        return res[len-1];
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档