华为机试复习--数组

NC61 两数之和

题目描述
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:

给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2

示例1
输入
[3,2,4],6

返回值
[2,3]

#include<unordered_map>
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> ans;
//         for(auto i=0;i<numbers.size();i++){
//             int t=target-numbers[i];
//             for(auto j=i+1;j<numbers.size();j++){
//                 if(t==numbers[j]){
//                     ans.push_back(i+1);
//                     ans.push_back(j+1);
//                     return ans;
//                 }
//             }
//         }
//         return ans;
//     }
    vector<int> twoSum(vector<int>& numbers, int target){
        vector<int> ans;
        unordered_map<int,int> ma;
        for(int i=0;i<numbers.size();i++){
            ma[numbers[i]]=i;//val--key
        }
        for(int i=0;i<numbers.size();i++){
            int t=target-numbers[i];
            if(ma.find(t)!=ma.end()&&ma.at(t)>i){
                ans={i+1,ma.at(t)+1};
                return ans;
            }
        }
        return ans;
    }
};

NC65 斐波那契数列

题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39
示例1
输入
4
返回值
3

class Solution {
public:
    int fb[45]={0};
    int Fibonacci(int n) {
        if(n==0)
            return 0;
        else if(n==1)
            return 1;
        else if(fb[n]!=0)
            return fb[n];
        else{
            fb[n]=Fibonacci(n-1)+Fibonacci(n-2);
            return Fibonacci(n-1)+Fibonacci(n-2);
        }
    }
};

NC73 数组中出现次数超过一半的数字

题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
示例1
输入
[1,2,3,2,2,2,5,4,2]

返回值
2

#include<unordered_map>
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        unordered_map<int,int> ma;
        for(int i=0;i<numbers.size();i++){
            ma[numbers[i]]++;
            if(ma[numbers[i]]>numbers.size()/2)
                return numbers[i];
        }
        return 0;
    }
};

NC37 合并区间

题目描述
给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
示例1
输入
[[10,30],[20,60],[80,100],[150,180]]

返回值
[[10,60],[80,100],[150,180]]

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    static bool cmp(const Interval &a,const Interval &b){
        return (a.start<b.start);
    }
    vector<Interval> merge(vector<Interval> &intervals) {
        sort(intervals.begin(),intervals.end(),cmp);//按照区间左端点大小排序
        vector<Interval> res;
        for(int i=0;i<intervals.size();){
            int l=intervals[i].start;
            int r=intervals[i].end;
            int ni=i+1;
            for(int j=i+1;j<intervals.size();j++){
                if(intervals[j].start<=r){
                    r=max(intervals[j].end,r);
                    ni=j+1;
                }
            }
            res.push_back({l,r});
            i=ni;
        }
        return res;
    }
};

NC18 顺时针旋转矩阵

题目描述

有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。
示例1
输入
复制

[[1,2,3],[4,5,6],[7,8,9]],3

返回值
复制

[[7,4,1],[8,5,2],[9,6,3]]

class Solution {
public:
    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        // write code here
        vector<vector<int>> ans=vector(n, vector<int>(n));
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                ans[i][j]=mat[n-j-1][i];
            }
        }
        return ans;
    }
};

NC59 矩阵的最小路径和

题目描述
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
示例1
输入
[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]

返回值
12

备注:
1≤n,m≤2000
1≤arri,j≤100

class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    int minPathSum(vector<vector<int> >& matrix) {
        // 最小路径和
        vector<vector<int>> dp=vector(2000, vector<int> (2000));
        int n=matrix.size();
        int m=matrix[0].size();
        dp[0][0]=matrix[0][0];
        for(int i=1;i<m;i++)
            dp[0][i]=dp[0][i-1]+matrix[0][i];
        for(int i=1;i<n;i++)
            dp[i][0]=dp[i-1][0]+matrix[i][0];
        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                dp[i][j]=min(dp[i-1][j],dp[i][j-1])+matrix[i][j];
            }
        }
        return dp[n-1][m-1];
    }
};
posted @ 2021-03-24 09:34  Jorgensen  阅读(187)  评论(0编辑  收藏  举报
#site_nav_under { display: none; } .c_ad_block, .ad_text_commentbox { display: none; margin: 0; padding: 0; } #ad_under_google { height: 0; overflow: hidden; } #ad_under_google a { display: none; }