牛客-剑指offer题解第一阶段目录

  • 牛客-剑指offer题解第一阶段
    • 考察点汇总
      • 二维数组中的查找
      • 旋转数组的最小数字
      • 调整数组顺序使奇数位于偶数前面
      • 顺时针打印矩阵
      • 数组中出现次数超过一半的数
      • 连续子数组的最大和
      • 把数组排成最小的数
      • 数组中的逆序对
      • 数字在升序数组中出现的次数
      • 数组中只出现过一次的两个数字
      • 数组中的重复数字
      • 构建乘积数组

考察点汇总

数组,贪心,二分,归并排序,动态规划

二维数组中的查找

题目

考察点:思路

class Solution {public:    bool Find(int target, vector<vector > array) {        if(array.size()==0)            return false;        if(array[0].size()==0)            return false;        int n=array.size();        int m=array[0].size();        for(int i=0,j=m-1;i=0;)        {            if(target>array[i][j])                i++;            else if(target<array[i][j])                j--;            else                return true;        }        return false;    }};

旋转数组的最小数字

题目

考察点:二分

class Solution {public:    int minNumberInRotateArray(vector rotateArray) {        int left=0,right=rotateArray.size()-1;        while(leftrotateArray[right])                left=mid+1;            else if(rotateArray[mid]<rotateArray[right])                right=mid;            else                right--;        }        return rotateArray[left];    }};

调整数组顺序使奇数位于偶数前面

题目

考察点:思路

class Solution {public:    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可     *     *      * @param array int整型vector      * @return int整型vector     */    vector reOrderArray(vector& array) {        int n=array.size();        vector array1(n);        int odd=0;        for(int i=0;i<n;i++)            if(array[i]%2)                odd++;        int index1=0,index2=odd;        for(int i=0;i<n;i++)        {            if(array[i]%2)                array1[index1++]=array[i];            else                array1[index2++]=array[i];        }        return array1;    }};

顺时针打印矩阵

题目

考察点:思路

class Solution {  public:    vector printMatrix(vector<vector > matrix) {        vector res;        if (matrix.size() == 0)            return res;        int up = 0;        int down = matrix.size() - 1;        int left = 0;        int right = matrix[0].size() - 1;        while (up <= down && left <= right) {            for (int i = left; i  down)                break;            for (int i = up; i  right)                break;            for (int i = right; i >= left; i--)                res.push_back(matrix[down][i]);            down--;            if (up > down)                break;            for (int i = down; i >= up; i--)                res.push_back(matrix[i][left]);            left++;            if (left > right)                break;        }        return res;    }};

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

题目

考察点:哈希,思路

class Solution {public:    int MoreThanHalfNum_Solution(vector numbers) {        int n=numbers.size();        unordered_map mp;        for(int i=0;in/2)                return numbers[i];        }        return 0;    }};

连续子数组的最大和

题目

考察点:动态规划,贪心

class Solution {  public:    int FindGreatestSumOfSubArray(vector array) {        int n = array.size();        vector dp(n, 0);        dp[0] = array[0];        int maxn=dp[0];        for (int i = 1; i < n; i++)        {            dp[i]=max(dp[i-1]+array[i],array[i]);            maxn=max(maxn,dp[i]);        }        return maxn;    }};

把数组排成最小的数

题目

考察点:贪心,排序

class Solution {public:    static bool cmp(string a,string b){        return a+b<b+a;    }    //C++11的话直接用to_string(int n)    static string toString(int n){        if(n==0)            return "0";        string str="";        int m;        while(n){            m=n%10;            n/=10;            str+=('0'+m);        }        reverse(str.begin(),str.end());        return str;    }    string PrintMinNumber(vector numbers) {        string res="";        vector strs;        for(int i=0;i<numbers.size();i++)            strs.push_back(toString(numbers[i]));        sort(strs.begin(),strs.end(),cmp);        for(int i=0;i<strs.size();i++)            res+=strs[i];        return res;    }};

数组中的逆序对

题目

考察点:归并排序

class Solution {  public:    int mod = 1000000007;    int merge(int left, int right, vector& data, vector& temp) {        //终止条件        if (left >= right)            return 0;        //为防止left+right超出整形范围可以这样写left+(right-left)/2        int mid = (left + right) / 2;        int res = merge(left, mid, data, temp) + merge(mid + 1, right, data, temp);        res %= mod;        int i = left, j = mid + 1;        for (int k = left; k <= right; k++)            temp[k] = data[k];        for (int k = left; k <= right; k++) {            if (i == mid + 1)                data[k] = temp[j++];            else if (j == right + 1 || temp[i] < temp[j])                data[k] = temp[i++];            else{                data[k] = temp[j++];                res += mid + 1 - i;            }        }        return res%mod;    }    int InversePairs(vector data) {        int n = data.size();        vector temp(n);        return merge(0, n - 1, data, temp);    }};

数字在升序数组中出现的次数

题目

考察点:二分

class Solution {public:    int find(vector& data,double k){        int left=0;        int right=data.size()-1;        while(leftk)                right=mid-1;            else                left=mid+1;        }        return left;    }    int GetNumberOfK(vector data ,int k) {        return find(data,k+0.5)-find(data,k-0.5);    }};

数组中只出现过一次的两个数字

题目

考察点:位运算,哈希

class Solution {public:    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可     *     *      * @param array int整型vector      * @return int整型vector     */    vector FindNumsAppearOnce(vector& array) {        unordered_map mp;        vector res;        for(int i=0;i<array.size();i++)            mp[array[i]]++;        for(int i=0;i<array.size();i++)            if(mp[array[i]]==1)                res.push_back(array[i]);        if(res[0]<res[1])            return res;        return {res[1],res[0]};    }};

数组中的重复数字

题目

考察点:思路

class Solution {public:    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可     *     *      * @param numbers int整型vector      * @return int整型     */    int duplicate(vector& numbers) {        set res;        for(int i=0;i<numbers.size();i++)            if(!res.insert(numbers[i]).second) return numbers[i];        return -1;    }};

构建乘积数组

题目

考察点:思路

class Solution {public:    vector multiply(const vector& A) {        vector res(A.size(),1);        //前缀和        for(int i=1;i=0;i--){            res[i]*=ans;            ans*=A[i];        }        return res;    }};