查找数组

时间:2015-11-17 05:41:19

标签: java arrays algorithm

之前已经问过这个问题。但是我只是想知道我的代码有什么问题。它通过大多数测试用例,但不是所有测试用例都在lintcode上。

给定一个整数数组,大多数数字是发生超过数组大小一半的数字。找到它。

public class Solution {
    /**
     * @param nums: a list of integers
     * @return: find a  majority number
     */
    public int majorityNumber(ArrayList<Integer> nums) {
        // write your code
        Collections.sort(nums);
        int j = 0, count = 0, out = 0, size = nums.size();

        for(int i = 0; i < size; i++) {
            if(nums.get(j) == nums.get(i)) {
                count++;
                if(count > size/2){
                    out = nums.get(i);
                }
            } else {
                count = 1;
                j = i;
            }
        }
        return out;
    }
}

修改

我将代码更改为j = i&amp;如答案所示,count = 1。

例如,对于输入[1,1,1,2,2,2,2],输出应为2。 我的代码适用于这种情况。它在大输入情况下不起作用。

我不想要其他解决方案,因为我已经在其他网站上找到了许多O(n)解决方案。我只是想修复自己的代码并知道我做错了什么。

3 个答案:

答案 0 :(得分:3)

这是一个智能解决方案,可以在最坏的情况下运行O(n),并且没有额外的空间:

  public static int majorityNumber(List<Integer> nums) {
    int candidate = 0;
    int count = 0;
    for (int num : nums) {
      if (count == 0)
        candidate = num;
      if (num == candidate)
        count++;
      else
        count--;
    }
    return candidate;
  }

请注意,它假定存在多数值,否则返回任意值。

答案 1 :(得分:0)

调试代码并打印ij的值。我确信那不是你想做的事。

您想要阅读每个元素并计算它的频率。这将是O(n*n)(因为数组已排序O(n log(n)))解决方案。

ArrayList<Integer> readNums = new ArrayList();
for(int i = 0; i < a.length; ++i)
{
  int currentNum = a[i];
  if(list.contains(currentNum)
    continue;//to check if you already processed that num
  else 
    list.add(currentNum);
  int count = 0;
  for(int j = i + 1; j < a.length; ++j)
  {
    if(currentNum == a[j])
      count ++;
   }
   if(count > size / 2)
    reqNum = currentNum;
}

这就是你想要做的。

更好的方法是使用O(n)空间并跟踪频率,然后在O(n)中处理数组。

HashMap<Integer, Intege> map = new HashMap();

for(int i = 0; i < a.length; ++i)
{
  int currentNum = a[i];
  int count = 1;
  if(map.containsKey(currentNum))
  {
    count = map.getValue(currentNum);
    map.put(currentNum, count + 1);
    count ++;
  }
  else
  {
    map.put(currentNum, count);
  }
  if(count > size / 2)
    reqNum = currentNum;
}

答案 2 :(得分:0)

在你的else块中执行:

...
else {
    count = 1;
    j = i;
}