返回介绍

solution / 1500-1599 / 1538.Guess the Majority in a Hidden Array / README_EN

发布于 2024-06-17 01:03:18 字数 9960 浏览 0 评论 0 收藏 0

1538. Guess the Majority in a Hidden Array

中文文档

Description

We have an integer array nums, where all the integers in nums are 0 or 1. You will not be given direct access to the array, instead, you will have an API ArrayReader which have the following functions:

  • int query(int a, int b, int c, int d): where 0 <= a < b < c < d < ArrayReader.length(). The function returns the distribution of the value of the 4 elements and returns:
    • 4 : if the values of the 4 elements are the same (0 or 1).
    • 2 : if three elements have a value equal to 0 and one element has value equal to 1 or vice versa.
    • 0 : if two element have a value equal to 0 and two elements have a value equal to 1.
  • int length(): Returns the size of the array.

You are allowed to call query() 2 * n times at most where n is equal to ArrayReader.length().

Return any index of the most frequent value in nums, in case of tie, return -1.

 

Example 1:

Input: nums = [0,0,1,0,1,1,1,1]
Output: 5
Explanation: The following calls to the API
reader.length() // returns 8 because there are 8 elements in the hidden array.
reader.query(0,1,2,3) // returns 2 this is a query that compares the elements nums[0], nums[1], nums[2], nums[3]
// Three elements have a value equal to 0 and one element has value equal to 1 or viceversa.
reader.query(4,5,6,7) // returns 4 because nums[4], nums[5], nums[6], nums[7] have the same value.
we can infer that the most frequent value is found in the last 4 elements.
Index 2, 4, 6, 7 is also a correct answer.

Example 2:

Input: nums = [0,0,1,1,0]
Output: 0

Example 3:

Input: nums = [1,0,1,0,1,0,1,0]
Output: -1

 

Constraints:

  • 5 <= nums.length <= 105
  • 0 <= nums[i] <= 1

 

Follow up: What is the minimum number of calls needed to find the majority element?

Solutions

Solution 1

# """
# This is the ArrayReader's API interface.
# You should not implement it, or speculate about its implementation
# """
# class ArrayReader(object):
#    # Compares 4 different elements in the array
#    # return 4 if the values of the 4 elements are the same (0 or 1).
#    # return 2 if three&nbsp;elements have a value&nbsp;equal to 0&nbsp;and one&nbsp;element has value equal to 1&nbsp;or vice versa.
#    # return 0 :&nbsp;if two element have a value equal to 0 and two elements have a value equal to 1.
#  def query(self, a: int, b: int, c: int, d: int) -> int:
#
#    # Returns the length of the array
#  def length(self) -> int:
#


class Solution:
  def guessMajority(self, reader: "ArrayReader") -> int:
    n = reader.length()
    x = reader.query(0, 1, 2, 3)
    a, b = 1, 0
    k = 0
    for i in range(4, n):
      if reader.query(0, 1, 2, i) == x:
        a += 1
      else:
        b += 1
        k = i

    y = reader.query(0, 1, 2, 4)
    if reader.query(1, 2, 3, 4) == y:
      a += 1
    else:
      b += 1
      k = 0
    if reader.query(0, 2, 3, 4) == y:
      a += 1
    else:
      b += 1
      k = 1
    if reader.query(0, 1, 3, 4) == y:
      a += 1
    else:
      b += 1
      k = 2

    if a == b:
      return -1
    return 3 if a > b else k
/**
 * // This is the ArrayReader's API interface.
 * // You should not implement it, or speculate about its implementation
 * interface ArrayReader {
 *   public:
 *   // Compares 4 different elements in the array
 *   // return 4 if the values of the 4 elements are the same (0 or 1).
 *   // return 2 if three&nbsp;elements have a value&nbsp;equal to 0&nbsp;and one&nbsp;element has value equal to 1&nbsp;or
 * vice versa.
 *   // return 0 :&nbsp;if two element have a value equal to 0 and two elements have a value equal
 * to 1. public int query(int a, int b, int c, int d);
 *
 *   // Returns the length of the array
 *   public int length();
 * };
 */

class Solution {
  public int guessMajority(ArrayReader reader) {
    int n = reader.length();
    int x = reader.query(0, 1, 2, 3);
    int a = 1, b = 0;
    int k = 0;
    for (int i = 4; i < n; ++i) {
      if (reader.query(0, 1, 2, i) == x) {
        ++a;
      } else {
        ++b;
        k = i;
      }
    }

    int y = reader.query(0, 1, 2, 4);
    if (reader.query(1, 2, 3, 4) == y) {
      ++a;
    } else {
      ++b;
      k = 0;
    }
    if (reader.query(0, 2, 3, 4) == y) {
      ++a;
    } else {
      ++b;
      k = 1;
    }
    if (reader.query(0, 1, 3, 4) == y) {
      ++a;
    } else {
      ++b;
      k = 2;
    }
    if (a == b) {
      return -1;
    }
    return a > b ? 3 : k;
  }
}
/**
 * // This is the ArrayReader's API interface.
 * // You should not implement it, or speculate about its implementation
 * class ArrayReader {
 *   public:
 *   // Compares 4 different elements in the array
 *   // return 4 if the values of the 4 elements are the same (0 or 1).
 *   // return 2 if three&nbsp;elements have a value&nbsp;equal to 0&nbsp;and one&nbsp;element has value equal to 1&nbsp;or vice versa.
 *   // return 0 :&nbsp;if two element have a value equal to 0 and two elements have a value equal to 1.
 *   int query(int a, int b, int c, int d);
 *
 *   // Returns the length of the array
 *   int length();
 * };
 */

class Solution {
public:
  int guessMajority(ArrayReader& reader) {
    int n = reader.length();
    int x = reader.query(0, 1, 2, 3);
    int a = 1, b = 0;
    int k = 0;
    for (int i = 4; i < n; ++i) {
      if (reader.query(0, 1, 2, i) == x) {
        ++a;
      } else {
        ++b;
        k = i;
      }
    }

    int y = reader.query(0, 1, 2, 4);
    if (reader.query(1, 2, 3, 4) == y) {
      ++a;
    } else {
      ++b;
      k = 0;
    }
    if (reader.query(0, 2, 3, 4) == y) {
      ++a;
    } else {
      ++b;
      k = 1;
    }
    if (reader.query(0, 1, 3, 4) == y) {
      ++a;
    } else {
      ++b;
      k = 2;
    }
    if (a == b) {
      return -1;
    }
    return a > b ? 3 : k;
  }
};
/**
 * // This is the ArrayReader's API interface.
 * // You should not implement it, or speculate about its implementation
 * type ArrayReader struct {
 * }
 * // Compares 4 different elements in the array
 * // return 4 if the values of the 4 elements are the same (0 or 1).
 * // return 2 if three&nbsp;elements have a value&nbsp;equal to 0&nbsp;and one&nbsp;element has value equal to 1&nbsp;or vice versa.
 * // return 0 :&nbsp;if two element have a value equal to 0 and two elements have a value equal to 1.
 * func (this *ArrayReader) query(a, b, c, d int) int {}
 *
 * // Returns the length of the array
 * func (this *ArrayReader) length() int {}
 */

func guessMajority(reader *ArrayReader) int {
  n := reader.length()
  x := reader.query(0, 1, 2, 3)
  a, b := 1, 0
  k := 0
  for i := 4; i < n; i++ {
    if reader.query(0, 1, 2, i) == x {
      a++
    } else {
      b++
      k = i
    }
  }

  y := reader.query(0, 1, 2, 4)
  if reader.query(1, 2, 3, 4) == y {
    a++
  } else {
    b++
    k = 0
  }
  if reader.query(0, 2, 3, 4) == y {
    a++
  } else {
    b++
    k = 1
  }
  if reader.query(0, 1, 3, 4) == y {
    a++
  } else {
    b++
    k = 2
  }
  if a == b {
    return -1
  }
  if a > b {
    return 3
  }
  return k
}
/**
 * // This is the ArrayReader's API interface.
 * // You should not implement it, or speculate about its implementation
 * class ArrayReader {
 *   // Compares 4 different elements in the array
 *   // return 4 if the values of the 4 elements are the same (0 or 1).
 *   // return 2 if three&nbsp;elements have a value&nbsp;equal to 0&nbsp;and one&nbsp;element has value equal to 1&nbsp;or vice versa.
 *   // return 0 :&nbsp;if two element have a value equal to 0 and two elements have a value equal to 1.
 *   query(a: number, b: number, c: number, d: number): number { };
 *
 *   // Returns the length of the array
 *   length(): number { };
 * };
 */

function guessMajority(reader: ArrayReader): number {
  const n = reader.length();
  const x = reader.query(0, 1, 2, 3);
  let a = 1;
  let b = 0;
  let k = 0;
  for (let i = 4; i < n; ++i) {
    if (reader.query(0, 1, 2, i) === x) {
      ++a;
    } else {
      ++b;
      k = i;
    }
  }
  const y = reader.query(0, 1, 2, 4);
  if (reader.query(1, 2, 3, 4) === y) {
    ++a;
  } else {
    ++b;
    k = 0;
  }
  if (reader.query(0, 2, 3, 4) === y) {
    ++a;
  } else {
    ++b;
    k = 1;
  }
  if (reader.query(0, 1, 3, 4) === y) {
    ++a;
  } else {
    ++b;
    k = 2;
  }
  if (a === b) {
    return -1;
  }
  return a > b ? 3 : k;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文