给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于n/2的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 * * 示例1: * 输入:[3,2,3] * 输出:3
做题收获:好的算法真的会节省时间复杂度和空间复杂度
本体算法思想:
定义一个count变量和当前默认多数元素c,用一个for循环遍历,遍历的过程中判断这个数是否等于c,相等则count++;反之则count--。在这个过程中若count等于0,则说明当前的多数元素c并不是真正的多数元素,则将此时遍历到的新数赋给多数元素c,这样循环直至遍历完整个数组。因为多数元素是指数组中出现次数大于n/2的元素且题目假设给定的数组总是存在多数元素,故最后的count一定大于0,此时对应的多数元素c也必然为该数组的多数元素。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class test19 {
/**
* 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于n/2的元素。
* 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
*
* 示例1:
* 输入:[3,2,3]
* 输出:3
*
* 示例2:
* 输入:[2,2,1,1,1,2,2]
* 输出:2
*
* 进阶:
* 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
*
* @param args
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(",");
int[] nums = new int[str.length];
for(int i=0; i< str.length; i++){
nums[i] = Integer.parseInt(str[i]);
}
System.out.println(majorityElement(nums));
}
public static int majorityElement(int[] nums){
int count = 0;
Integer c = null;
for(int num: nums){
if(count == 0){
c = num;
}
count += (num == c) ? 1 : -1;
}
return c;
}
}