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;
    }
}