数据结构数组相关代码(数据结构笔试复测Leecode牛客)

Posted 小葵花幼儿园园长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构数组相关代码(数据结构笔试复测Leecode牛客)相关的知识,希望对你有一定的参考价值。

数组

简单

两数之和

描述

给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)

解题思路:

  • 两个for循环(缺点:超时)
  • 哈希表<取值, 下标>
class Solution 
public:
    /**
     * 
     * @param numbers int整型vector 
     * @param target int整型 
     * @return int整型vector
     */
    vector<int> twoSum(vector<int>& numbers, int target) 
        // write code here
        vector<int> res;
        int n = numbers.size();
        if(n==0)
            return res;
        
        unordered_map<int, int> haxi;//定义哈希表,<取值,下标>
        for(int i=0; i<n; i++)
            if(haxi.count(target-numbers[i])) //找到执行,没找到不执行
                res.push_back(haxi[target-numbers[i]]+1);
                res.push_back(i+1);
                break;
            else
                //将未找到的值插入哈希表中
                haxi[numbers[i]] = i;
            
        
        return res;
    
    
//        for(int i=0; i<numbers.size()-1; i++)
//            for(int j=i+1; j<numbers.size(); j++)
//                if(numbers[i] + numbers[j] == target)
//                    res.push_back(i+1);
//                    res.push_back(j+1);
//                    return res;
//                     
//            
//        
//        return res;
//    
;

合并两个有序的数组

描述

给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组

注意

1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印
3. A 数组在[0,m-1]的范围也是有序的

思路:

  • step 1:使用三个指针,i指向数组A的最大元素,j指向数组B的最大元素,k指向数组A空间的结尾处。
  • step 2:从两个数组最大的元素开始遍历,直到某一个结束,每次取出较大的一个值放入数组A空间的最后,然后指针一次往前。
  • step 3:如果数组B先遍历结束,数组A前半部分已经存在了,不用管;但是如果数组A先遍历结束,则需要把数组B剩余的前半部分依次逆序加入数组A前半部分,类似归并排序最后的步骤。
class Solution 
public:
    void merge(int A[], int m, int B[], int n) 
        int i = m-1, j = n-1, k = m+n-1;
        while(i>=0 && j>=0)
            if(A[i] > B[j])
                A[k--] = A[i--];
            else
                A[k--] = B[j--];
        
        if(i < 0)
            while(j>=0)
                A[k--] = B[j--];
        
    
;

中等

最长无重复子数组

描述

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

解题思路

  • step 1:构建一个哈希表,用于统计数组元素出现的次数。
  • step 2:窗口左右界都从数组首部开始,每次窗口优先右移右界,并统计进入窗口的元素的出现频率。
  • step 3:一旦右界元素出现频率大于1,就需要右移左界直到窗口内不再重复,将左边的元素移除窗口的时候同时需要将它在哈希表中的频率减1,保证哈希表中的频率都是窗口内的频率。
  • step 4:每轮循环,维护窗口长度最大值。
class Solution 
public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) 
        // write code here
        unordered_map<int, int> mp;
        int res = 0;
        int j = 0;
        for(int i=0; i<arr.size(); i++)
            
            //右移进入哈希表统计出现次数
            mp[arr[i]]++;
            //出现次数大于1,有重复
            while(mp[arr[i]] > 1)
                mp[arr[j++]]--;
            res = max(res, i-j+1);
        
        return res;
    
;
阅读世界,共赴山海 423全民读书节,邀你共读

以上是关于数据结构数组相关代码(数据结构笔试复测Leecode牛客)的主要内容,如果未能解决你的问题,请参考以下文章

排序相关代码(数据结构笔试复测Leecode牛客)

数据结构栈队列相关代码(数据结构笔试复测Leecode牛客)

数据结构字符串相关代码(数据结构笔试复测Leecode牛客)

数据结构树相关代码(数据结构笔试复测Leecode牛客)

动态规划(数据结构笔试复测Leecode牛客)

基础算法(数据结构笔试复测Leecode牛客)