【LeetCode 954】二倍数对数组

题目描述

给定一个长度为偶数的整数数组 arr,只有对 arr 进行重组后可以满足 “对于每个 0 <= i < len(arr) / 2,都有 arr[2 * i + 1] = 2 * arr[2 * i]” 时,返回 true;否则,返回 false。

示例 1

输入:arr = [3,1,3,6]
输出:false

示例 2

输入:arr = [2,1,2,6]
输出:false

示例 3

输入:arr = [4,-2,2,-4]
输出:true
解释:可以用 [-2,-4][2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]
  • 0 <= arr.length <= 3 * 104
  • arr.length 是偶数
  • -105 <= arr[i] <= 105
涉及到的知识点 : 哈希表 贪心 数组 排序

思路

     其实就是一个匹配问题,首先将向量中的元素以及其出现的次数存储在哈希表map中,将向量中的元素进行排序再遍历,判断每个数(偶数时)都和它的两倍的数或者它的一半的数是否能成功组合,当前个数小于0说明不够用,不能组合,(奇数只需要判断 该数都和它的两倍的数是否能成功组合);最终再遍历一遍,检查哈希表中所有key对应的值(对应元素出现的次数)是否都为0,一旦不为0表示,组合失败,返回false。

bool canReorderDoubled(vector<int>& arr) {
	unordered_map<int,int> count;
	for(int x:arr)
		count[x]++;
	sort(arr.begin(),arr.end());//排序 避免跨度太大,导致匹配混乱出错
	for(int i=0;i<arr.size();i++){
		if(arr[i]%2==0 && count[arr[i]] && count[arr[i]/2])//偶数时,判断该数的一半的数是否能和他组合
		{
			count[arr[i]]--;
			count[arr[i]/2]--;
		}
		else if(arr[i]%2==0 && count[arr[i]] && count[2*arr[i]])//偶数时,判断该数的2倍的数是否能和他组合
		{
			count[arr[i]]--;
			count[2*arr[i]]--;
		}
		else  if(arr[i]%2==1 && count[arr[i]] && count[2*arr[i]])//奇数时,判断该数的2倍的数是否能和他组合
		{
			count[arr[i]]--;
			count[2*arr[i]]--;
		}
	}
	for(int x:arr)
		if(count[x]>0)//表示组合失败
			return 0;
	return 1;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值