力扣刷题解析

1.只出现一次的数字

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4

class Solution {
    public int singleNumber(int[] nums) {
        int [] values = new int[nums.length];
        int index = 0;
        for( int i = 0; i < nums.length; i++ ){  
            int flag = checkExist(values,nums[i]);
            if( flag != -1){
                //将传来的下标的值置空
                values[flag] = 0;
            }else{
                // 保存未出现的值
                values[index++] = nums[i];
            }
        }
      
        for(int i = 0; i<values.length; i++){
            // 如果值不为0直接输出
            if(values[i] != 0){
                return values[i];
            }
        }
        return 0;
    }
    //如果存在该值则返回存储的下标
    public int checkExist(int []nums, int value){
        
        for(int i = 0; i<nums.length; i++){
            if(nums[i] == value){
                return i;
            }
        }
        return -1;
    
    }
    
}

2.多数元素

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

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

示例 1:

输入: [3,2,3]
输出: 3
示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

class Solution {
    public int majorityElement(int[] nums) {
        int  num = nums.length;
        //[0]保存值 [1]保存出现的次数
        int[][] values = new int[num][2];
        for( int i=0; i<num; i++){
            // 判断是否存在
           int index = checkGetIndex(values,nums[i]);
            // 如果存在直接 让 出现的次数+1
           if( index != -1){
               values[index][1] += 1;
           }else{
               // 否则保存该值
               values[i][0] = nums[i];
           }   
        }
        for( int i=0; i<num; i++){
            if(values[i][1] >= num/2){
                return values[i][0];
            }
        }
        return 0;
    }
    public int checkGetIndex(int[][] values,int value){
        for(int i = 0; i<values.length; i++){
            if(value == values[i][0]){
                return i;
            }
        }
        return -1;
    }
}

合并两个有序数组

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3

输出: [1,2,2,3,5,6]

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int result = m;
        for(int i = 0; i < n; i++){
            int curr = nums2[i];
            
            for(int j = 0; j <= result; j++ ){
                // 如果当前数组1的值大于数组2的,则插入进去
                if( nums1[j] >= curr ){ 
                   // 插入下标即为j。
                   add(nums1,j,curr,result);
                   break;
                }
                //数组1遍历完了循环还没跳出去(即数组2没被加进去)说明当前数组2的值比数组1的任何一个数还要大,直接加到末尾就行。
                if( j == result){
                    add(nums1,result,curr,result);
                } 
            }
            //  考虑到增加 了i个数组2的值,所以 数组1的有效位增大,所以是 m+i。
            result += 1;
        }  
    }
    /* 
        nums为 num1 
        index为要插入的下标
        value为要插入的值
        m为当前i的有效值
    */
    public void add(int[] nums,int index,int value,int m){
        for(int i = m; i > index ; i--){
            nums[i] = nums[i-1];
        }
        nums[index] = value;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章