leetcode 刷题 算法 1
只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
class Solution { public: int singleNumber(vector<int>& nums) { int x = 0; for (auto ite : nums) x ^= ite; return x; } };
说明:采用异或,0与任何数异或得到数字本身 两个相同的数字异或等于0
不用去考虑是不是按顺序从可变数组中取元素
如过我们的测试数据是 {0,1,2,1,0}
机器会 都转化成2进制码
0 :0000
1: 0001 异或得 0001
2 :0010 异或得 0011
1 :0001 异或得 0010
0 :0000 异或得 0010
所得结果转化成10进制就是2
求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
int majorityNumber(vector<int>& nums) { int count = 1; int maj = nums[0]; for (int i=1; i!=nums.size(); i++) { if(nums[i]==maj) count++; else{ count--; if(count ==0) { maj = nums[i]; cout = 1; } } } return maj; }
摩尔投票法:因为题目对众数的要求是出现次数大于n/2的,我们可以用一个变量count来计数,如果他的出现次数大于n/2,那么它的count一定会大于0.
搜索矩阵
矩阵的特性 如下
- 每行的元素从左到右升序排列
- 每列的元素从上到下升序排列
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
bool searchMatrix(vector<vector<int>>& matrix,int target) { if (matrix.size() == 0) return false; int j = 0; int i = matrix[0].size()-1; while (j<matrix.size()&&i>-1) { if (target == matrix[j][i]) { return true; } if (matrix[j][i] < target) { j++; } else{ i--; } } return false; }
注意:不能简单使用二分法 因为它每行之间不是单调递增的 只能就根据每行最后一个元素大小来简单筛选,或者通过每行第一个元素
合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int t = m+n-1; int i = m-1, j=n-1; while(i>=0&&j>=0) { if (nums2[i]>nums1[j]) { nums1[t] = nums2[i]; t--; i--; } else{ nums1[t] = nums1[i]; t--; i--; } } }
注意:我们采用倒着插入的方法 将nums2中的元素比较放入nums1