单纯是对编过的垃圾代码写写备注,没有任何营养,不建议参考。
序号:1
难度:简单
用时:两天
2020-03-26~2020-03-27
我的肤浅想法:
当时很愚蠢的直接把这道题当成求众数的一道题,想法非常简单,建立新数组array,分别存放nums中每个数字的个数。将后续数字依次和之间判断过得数字进行比较,根据比较结果,要么将之前数字的对应array位加一,要么建立新的一个对应array位。最后再找出array中最大的一个array[j],则其对应的num[j]就是最多的数字。
当时出现的错误:
提交到Leecode在线运行的时候测试用例有的对有的错
经过修改发现问题:
①内层循环起始值不对,本来写的j从1开始,会造成num[0]和num[1]没参与比较,问题原因也与出现问题的测试用例相符。
出现问题的原因:
太长时间不写东西,头脑迟钝,思路不清晰,代码写了很久,中途有过间断,两次主题思想稍微有所差别,见代码注释掉的那行。第二次继续写的时候就忘了第一次加的这一行了。产生错误。
教训:
不要中断,多写注释,
观摩大佬们的答案的收获:
真是太震撼了
1.首先我根本没注意条件中提到的多数数字的具体定义(要求出现次数大于数组长度除2向下取整)
2.评论区的大佬的思想有三。
https://leetcode-cn.com/problems/majority-element/solution/3chong-fang-fa-by-gfu-2/
第一种和我的方法一个意思,但是用了hashmap很简洁的就实现了。我感觉这个通用一些。
第二种和第三种都利用了条件中提到的特殊定义。非常巧妙
第二种:排序,数组中间位数的数字即为最多数字。
第三种:摩尔投票法
感觉很狠
`码
class Solution {
public int majorityElement(int[] nums) {
int cand_num = nums[0], count = 1;
for (int i = 1; i < nums.length; ++i) {
if (cand_num == nums[i])
++count;
else if (--count == 0) {
cand_num = nums[i];
count = 1;
}
}
return cand_num;
}
}
作者:gfu
链接:https://leetcode-cn.com/problems/majority-element/solution/3chong-fang-fa-by-gfu-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。`
最下面是我的垃圾代码
public class majorityElement {
public int searchmajorityElement(int[] nums)
{
int majority = 0;
int length = nums.length;
int i,j,k;
int mark = 0;
int[] Array = new int[length];
//Array[0] = 1;改了一个地方,可能很多地方都要改
for(i=0; i<length; i++)
{
for(j=0;j<i;j++)//j开始是1造成错误,此时num[0]未参与比较
{
if(nums[j] == nums[i]){
Array[j]++;
break;
}
}
if(j==i)//不应该在内层循环里
Array[i]++;
}
for(k=0;k<length;k++)
{
if(Array[k]>Array[mark])
mark = k;
}
majority = nums[mark];
return majority;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums = {6,5,5};
int majority;
majorityElement solution = new majorityElement();
majority = solution.searchmajorityElement(nums);
System.out.println("最多的数字是:"+majority);
}
}