力扣刷題解析

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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章