该方法有什么问题?

时间:2018-12-24 18:12:22

标签: java arrays sorting

给出大小为n的数组,找到多数元素。多数元素是出现超过⌊n / 2次的元素。

您可以假定数组为非空并且多数元素始终存在于数组中。

我尝试了以下代码,其中一些测试用例无法正常工作。

class Solution {
      public int majorityElement(int[] nums) {
            int x = (nums.length)/2;
            int temp=0;
            for (int i=0;i<nums.length-1; i++){
                 if (nums[i]>nums[i+1]){
                    temp=nums[i+1];
                    nums[i+1]=nums[i];
                    nums[i]=temp;
                 }

            }
            if (nums.length==1){
                return nums[0];
            }
            if (nums.length%2==0){
                return nums[x];
            }
            else {
                return nums[(nums.length/2)+1];
            }
       }
}

当输入为[3,3,4]时,我的代码输出4而不是3。

3 个答案:

答案 0 :(得分:2)

由于Array是基于零的,因此您需要执行以下操作:

return nums[(nums.length/2)];

代替:

return nums[(nums.length/2)+1];

因此,如果Array由3个元素组成,它将返回中间元素而不是最后一个元素。

您的算法也不正确。对于Array [1,1,2,0],它将返回0。问题在于,由于您的排序仅是一个循环,因此不能保证将对整个Array进行排序。相反,您可以使用Arrays.sort

public static int foo(int[] nums) {
    int x = (nums.length)/2;
    Arrays.sort(nums);
    if (nums.length==1){
        return nums[0];
    }
    if (nums.length%2==0){
        return nums[x];
    }
    else {
        return nums[(nums.length/2)];
    }

} 

由于有一项规定,多数元素是出现超过⌊n / 2次的元素。可以简化为:

 public int majorityElement(int[] nums) {
     Arrays.sort(nums);
     return nums[nums.length/2]
}

答案 1 :(得分:0)

您可以检查数组中每个值的频率,如果其值大于n / 2,则按如下所示返回它。我认为这里的逻辑会更清楚

  public int majorityElement(int[] nums) {
        List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
        HashSet<Integer> set = new HashSet<>(list);

        for (int value: set) {
            if (Collections.frequency(list, value) > list.size() / 2) {
                return value;
            }
        }
        return -1;
    }

答案 2 :(得分:0)

import java.util.Arrays;

public class spl {
    public int majorityElement(int[] nums) {
       int x = (nums.length)/2;
       int counter=1;
       int majEl = -1; /// for no majority element is -1;
       boolean flag=false;
       bubbleSort(nums);

        for(int i=0;i<(nums.length+1)/2;i++) {
             if(flag) {break;}
            if(nums[i]==nums[i+1])
                while(nums[i]==nums[i+1]) {
                    ++counter;
                    i++;}
                    if(counter>=x) {
                        majEl=nums[i];
                        flag=true;
                        break;

                    }
                    else {counter=1;}
                }

        if (nums.length==1){
            return nums[0];
        }
        else {return majEl;}
   }

    private void bubbleSort(int[] arr) {

            int n = arr.length;  
            int temp = 0;  
             for(int i=0; i < n; i++){  
                     for(int j=1; j < (n-i); j++){  
                              if(arr[j-1] > arr[j]){  

                                     temp = arr[j-1];  
                                     arr[j-1] = arr[j];  
                                     arr[j] = temp;  
                             }  

                     }  
             }  

    }
}

说明:nums [8,7,3,3,3],在BubbleSort [3,3,3,7,8]之后,在循环中检查nums [0] == nums [1],++ counter,nums [1] == nums [2],++ counter ;,所以counter是3,比那个array.size大,所以您找到了多数元素