• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

╰☆惔、煙菋

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

找出数组中出现次数超过一半的数

方法有很多,我就用两种最直接的方法实现一下

方法一:比较法

最容易想到的办法当然是直接用比较法,因为是超过一半,所以最多只能有一个,如果有多于一个的话就矛盾了

时间复杂度O(N*N)

空间复杂度O(N)

public bool search(int nums[], int len, int & num)
{
	int count;
   int length = len / 2 + 1;
	
	for (int i = 0; i < len; ++ i)
	{
		count = 1;
		for (int j = i+1; j < len; ++ j)
		{
			if (nums[i] == nums[j])
			{
				count ++;
			}
			if (count >= length)
			{
				num = nums[i];
				return true;
			}
		}
	}
	return false;
}

方法二:排序法(这种数要一定存在)
将数组按升序排序,假设有N个数,第(N/2+1)个数就是你要找的,这里顺便复习一下快排
时间复杂度为O(N log N)
空间复杂度O(N)
int sort(int * nums, int low, int up)
{
     nums[0] = nums[low];
     int k = nums[0];
     while (low < up)
     {
          while (low < up && nums[low] >= k)
          {
               -- up;
          }
          nums[low] = nums[up];
          while (low < up && nums[low] <= k)
          {
               ++ low;
          }
          nums[up] = nums[low];
     }
     nums[low] = nums[0];
     return low;
}

void qsort(int *nums, int low, int up)
{
     if (low < up)
     {
          int loc = sort(nums, low, up);
          qsort(nums, low, loc - 1);
          qsort(nums, loc + 1, up);
     }
}

void search(int * nums, int len, int & num)
{
     qsort(nums, 1, len);
     num =  nums[len/2+1];
}

posted on 2011-06-30 10:57  ╰☆惔、煙菋  阅读(310)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3