1.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
代码
class Solution {
public int singleNumber(int[] nums) {
/*
异或,
a^0=a
a^a=0
a^b^c=a^c^b 交换律
a^b^a=0 自反 4^1^2^1^2=4^1^1^2^2=4^0=4
*/
int result=0;
for(int i=0;i<nums.length;i++){
result=result^nums[i];
}
return result;
/*
使用HashSet,判断是否能够添加,不能说明重复,直接移除,剩下的就是单独的那个
Set<Integer> set=new HashSet<>();
for(int num:nums){
if(!set.add(num)){
//如果添加失败,说明这个值
//在集合Set中存在,我们要
//把他给移除掉
set.remove(num);
}
}
//最终集合Set中只有一个元素,我们直接返回
return (int)set.toArray()[0];
*/
}
}
2.多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
进阶:
- 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
代码
class Solution {
public int majorityElement(int[] nums) {
/*
//思路:使用HashMap存储键值对,统计出现次数
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
int count=map.getOrDefault(nums[i],0)+1;
if(count>nums.length/2)
return nums[i];
map.put(nums[i],count);
}
return -1;
*/
//摩尔投票法,相同就+1,不同就-1,个数为0,重新赋值
int boss=nums[0];//先让第一个士兵所属军队当主力军
int count=1;
for(int i=1;i<nums.length;i++){
if(count==0)//消除完了,重新赋值
{
count=1;
boss=nums[i];
}
else if(nums[i]==boss)//相同就加一
{
count++;
}else//不同就同归于尽,减一
{
count--;
}
}
return boss;//返回剩下的一支军队(主力军)
}
}
3.搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例 1:
输入:matrix = [[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]], target = 5
输出:true
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= n, m <= 300
- -109 <= matix[i][j] <= 109
- 每行的所有元素从左到右升序排列
- 每列的所有元素从上到下升序排列
- -109 <= target <= 109
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//二分思路 右上角依次向左下角进行比较,如果大于target向左找,如果小于target向下找
int row=0;//行
int col=matrix[0].length-1;//列
while(col>=0&&row<=matrix.length-1){
if(matrix[row][col]==target)//如果找到就返回
{
return true;
}else if(matrix[row][col]>target)//如果大于target向左找,col--
{
col--;
}else if(matrix[row][col]<target)//如果小于target向下找,row++
{
row++;
}
}
return false;
}
}