LeetCode 169.求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于
⌊ 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;
}