问题:
题目的要求就是在一个任意数量的整型数组中,找出数组中个数超过 n/3 次 (n表示数组的长度)的元素。
解答题目:
对于此题,我用了两种解答的方法,第一种是比较容易想到的,但用时长,第二种是看了网上思路,然后自己操作了一遍。
第一种解法:
思路:
先获得数组长度 ,记录在length,定义一个计数变量 temp ,然后通过双层for循环对数组中的元素逐一进行对比,如果相等则 temp 加1,以此获得每个元素出现的个数。
代码实现:
public List<Integer> majorityElement(int[] nums){
int length = nums.length;
List<Integer> newArray = new ArrayList<Integer>();
for(int i =0;i<length;i++) {
int temp = 1;
for(int j=0;j<length&&j!=i;j++) {
if(nums[i]==nums[j]) {
temp+=1;
}
}
//判断元素 是否大于 length/3
if(temp>length/3&&!newArray.contains(nums[i])) {
newArray.add(nums[i]);
}
}
return newArray;
}
如下是运行消耗资源截图,可以看见运行的时间很长。
第二种解法:
思路:
先对给定的数组进行排序,排序后就会发现数组中元素相同会挨在一起,此时用一层for循环进行比较即可。
代码实现:
public List<Integer> majorityElement(int[] nums){
int length = nums.length;
List<Integer> newArray = new ArrayList<Integer>();
int temp = 1;
Arrays.sort(nums);
for(int k=1;k<length;k++) {
if(nums[k]==nums[k-1]) {
temp+=1;
}
else {
if(temp>length/3) {
newArray.add(nums[k-1]);
}
temp = 1;
}
}
if(temp>length/3&&length!=0) {
newArray.add(nums[length-1]);
}
return newArray;
}
如下是运行消耗资源截图,可以看见这种解法的运行的时间比第一种少了很多很多。