前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Leetcode-136.只出现一次的数字 -169.多数元素】

【Leetcode-136.只出现一次的数字 -169.多数元素】

作者头像
YoungMLet
发布2024-03-01 09:20:21
950
发布2024-03-01 09:20:21
举报
文章被收录于专栏:C++/Linux

Leetcode-136.只出现一次的数字

题目:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外, 其余每个元素均出现两次。找出那个只出现了一次的元素。

我们的思路是,把数组中的数全部异或在一起,相同的数异或在一起等于0,而0和任意数异或等于任意数;

代码语言:javascript
复制
		int singleNumber(int* nums, int numsSize)
		{
		    int single = 0;
		    for (int i = 0; i < numsSize; i++)
		    {
		        single ^= nums[i];
		    }
		    return single;
		}

Leetcode-169.多数元素

题目:给定一个大小为 n 的数组 nums ,返回其中的多数元素。 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素

1.直接排序暴力求解法1

这个思路是,直接将数组快排,然后用count统计当前的元素是否满足条件,若满足,返回;若不满足,更新当前的元素,继续用count统计;直到最后一个元素都没返回的话,那么最后一个元素就是多数元素,因为可以假设给定的数组总是存在多数元素,所以上面没有返回的话,肯定是最后一项就是多数元素;

代码语言:javascript
复制
		int compare(const void* p1, const void* p2)
		{
		    return (*(int*)p1 - *(int*)p2);
		}
		
		int majorityElement(int* nums, int numsSize)
		{
		    int count = 0,  i = 0;
		
		    //排序数组,从小到大
		    qsort(nums, numsSize, sizeof(int), compare);
		
		    //初始化flag的值为排序好的数组第一项
		    int flag = nums[0];
		
		    //从头开始遍历
		    for (i = 0; i < numsSize; i++)
		    {
		        //如果这一项与flag当前的项相等,count++
		        if (flag == nums[i])
		        {
		            count++;
		        }
		        //如果不相等,将这一项赋给flag,更新当前的flag
		        //并计算当前的count是否已经大于 numsSize / 2,如果大于,直接返回
		        //如果还没有大于,将count置0,继续寻找,并且++,因为是i++后再进来的else,没有统计当前这个flag
		        else
		        {
		            flag = nums[i];
		            if (count > numsSize / 2)
		            {
		                return nums[i - 1];
		            }
		            count = 0;
		            count++;
		        }
		    }
		    //因为可以假设给定的数组总是存在多数元素
		    //所以上面没有返回的话,肯定是最后一项就是多数元素
		    return nums[i - 1];
		}

2. 直接排序暴力求解法2

因为多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素,所以排序后,下标为 numsSize / 2 的一定为多数元素;

代码语言:javascript
复制
		int compare(const void* p1, const void* p2)
		{
		    return (*(int*)p1 - *(int*)p2);
		}
		
		int majorityElement(int* nums, int numsSize)
		{			
		    //排序数组,从小到大
		    qsort(nums, numsSize, sizeof(int), compare);
		
		    return nums[numsSize / 2];
		}

3. 投票法

还有一个思路是投票法,将不同的元素相互抵消,存留到最后的一定就是多数元素;

代码语言:javascript
复制
		int majorityElement(int* nums, int numsSize)
		{
		    int majority = nums[0], count = 0;
		    for (int i = 0; i < numsSize; i++)
		    {
		        //遍历数组,如果nums[i]等于需要投票的数字,count++
		        if (majority == nums[i])
		        {
		            count++;
		        }
		        //如果不等于,count--
		        //并判断count是否小于0,若小于0,更新majority,并改count为1
		        //注意,count小于0也不能说明当前的num[i]或者majority是多数元素
		        //只能说明num[i]之前不同的元素已经完全抵消,从nums[i]开始往后继续抵消
		        else
		        {
		            count--;
		            if (count < 0)
		            {
		                majority = nums[i];
		                count = 1;
		            }
		        }
		    }
		    return majority;
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Leetcode-136.只出现一次的数字
  • Leetcode-169.多数元素
    • 1.直接排序暴力求解法1
      • 2. 直接排序暴力求解法2
        • 3. 投票法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档