Java数组(算法169,747):多数元素,至少是其他数字两倍的最大数

题目一(多数元素):

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。
题目

题目分析:

  1. 从所给数组中找出出现次数大于n/2的数字
  2. 因为是大于n/2的数字,所以只有一个符合要求的数字
  3. 懂得运用该题目的特性进行解题

题目解答:

  1. 方法一(依次遍历):
    找出出现次数大于n/2的数字
    建立两个指针,进行判断是否相等
    若相等,则count++
    若不等,进行下一个判断
    最后判断长度是否大于n/2,并进行输出
  2. 方法二(利用题目)
    从第一个数字开始count
    如果与那个数字相同,视为1
    若不同视为-1
    最后对count的值进行判断

代码实现:

  1. 方法一(依次遍历):
//依次遍历,找出出现次数大于n/2的数字,只有一个符合要求的数字
        int max=nums[0];
        for(int i=0;i<nums.length;i++){
            int count=1;
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]==nums[j]){
                    max=nums[i];
                    count++;
                }
            }
            if(count>(nums.length/2)){
                return max;
            }
        }
  1. 方法二(利用多数元素的性质)
//利用题中性质,从一个数字开始count,如果与那个数字相同,则视为1,如果不同,则视为-1
        //最后对count值进行计数判断
        for(int i=0;i<nums.length;i++){
            int count=1;
            for(int j=0;j<nums.length;j++){
                if(nums[i]==nums[j]){
                    count++;
                }else{
                    count--;
                }

            }
            if(count>0){
                return nums[i];
            }
        }
        return -1;

代码总结:

  1. 方法一:所占用的空间较大,且代码相比其他的方法过多,不推荐使用;
  2. 方法二:巧妙的运用了多数元素的性质(新思路)

题目二(至少是其他数字两倍的最大数):

在一个给定的数组nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1

在这里插入图片描述

题目分析:

  1. 遍历找出数组中最大的数字
  2. 这个数字还需要是至少大于数组中其他元素两倍

题目解答:

  1. 利用指针找出最大的数字
  2. 并进行遍历判断,是否大于数组中其他数字的两倍

代码实现:

//找到最大值
        int max=nums[0];
        int a=0;
        for(int i=1;i<nums.length;i++){
            if(nums[i]>max){
                max=nums[i];
                a=i;
            }
        }
        //对最大值进行判断
        for(int i=0;i<nums.length;i++){
            //对与max的值不同的进行判断
            if(a!=i){
                if(max<2*nums[i]){
                    return -1;
                }
            }
        }
        return a;

代码总结:

该题目较为简单,思路清晰且正确即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值