【LeetCode】没想到的解法们(C++)

LeetCode 169.求众数

给定一个大小为 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

第一思路:

Sort + 取中间位置数

复杂度较高。

第二思路:

摩尔投票法,O(n)

    int majorityElement(vector<int>& nums) {
        /* 
        //sort取中间
        int length = end(nums)-begin(nums);
        sort(begin(nums),end(nums));
        return nums[length/2];
        */
        //摩尔投票法 O(n)
        int temp = nums[0];
        int count = 0,length = end(nums)-begin(nums);
        for(int i=0;i<length;i++){
            if(temp == nums[i]){
                count++;
            }
            else{
                count--;
                if(count == 0){
                    temp = nums[i+1];
                }
            }
        }
        return temp;
    }

LeetCode 136.只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

思路一:

Map对每个元素记录,再找出超过1的。空间复杂度较高。

思路二:

异或,出现两次的数字会相互抵消,剩余数字为出现一次的元素。

    int singleNumber(vector<int>& nums) {
        int x = 0;
        int length = end(nums) - begin(nums);
        for (int i=0;i<length;i++){
            x = x ^ nums[i];
        }
        return x;
    }

LeetCode 240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

思路一:

递归,对每个初始矩阵划分成四部分,每次搜索arr[m/2][n/2]位置的数,小于则继续找左上角,大于则省略左上角。但在数字为右下角时复杂度过高。且实现起来蛮复杂的。

思路二:

从右上角开始,对右上角的数n,若n小于target则当前行均小于target,故m++。若大于target则当前列均大于target,故n--。

    bool searchMatrix(vector<vector<int>>& arr, int target) {
        if(arr.empty() || arr[0].empty()) return false;
        int m = arr.size();
        int n = arr[0].size();
        int row = 0, clo = n-1;
        while(row < m && clo >= 0){
            if(arr[row][clo]==target) return true;
            else if(arr[row][clo] < target) row++;
            else clo--;
        }
        return false;
    }

猜你喜欢

转载自blog.csdn.net/PPPPluie/article/details/88803048