首页 > 其他分享 >力扣-491-递增子序列

力扣-491-递增子序列

时间:2022-09-29 16:59:00浏览次数:79  
标签:hashValue temp nums int 递增 力扣 vector 序列 491

起因是我做笔试,要写出所有子序列并做条件判断,我以为是回溯改一改,但事实上完全不是这样的

直达链接

主要是1,利用二进制序列枚举快速生成所有的可能子序列,然后利用哈希算法对数组去重(这个哈希算法可以直接背)

	vector<int> temp;
	vector<vector<int>> res;
	unordered_set<int> set;
	int n;

	void findSubsequences(int mask, vector<int>& nums) {
		temp.clear();
		for (int i = 0; i < n; i++) {
			// 就是二进制位为1的才插入临时数组
			// 从左右哪边开始无所谓,但是位运算是从右边开始的
			if (mask & 1) temp.push_back(nums[i]);
			mask >>= 1;
		}
	}

	int getHash(int base, int mod) {
		int hashValue = 0;
		for (int i : temp) {
			hashValue = 1LL * hashValue * base % mod + (i + 101);
			hashValue %= mod;
		}
	}

	bool check() {
		for (int i = 0; i < temp.size() - 1; i++) if (temp[i] > temp[i + 1]) return false;
		// 本来是return true,但是依题意一个元素的也不算
		return temp.size() >= 2;
	}

	vector<vector<int>> findSubsequences(vector<int>& nums) {
		n = nums.size();
		// 这个位运算构造二进制序列真的妙
		for (int i = 0; i < (1 << n); ++i) {
			findSubsequences(i, nums);
			// 检查temp数组是否有重复的
			// 通过为每个数组生成一个hash码
			int hashValue = getHash(263, int(1E9) + 7);
			// 这里,set没有count()方法,原来查找是这么用的
			if (check() && set.find(hashValue) == set.end()) {
				res.push_back(temp);
				set.emplace(hashValue);
			}
		}
		return res;
	}
};

但是好像还是不是我想要的,我想要的是全排列+所有子排列,不是子序列啊

标签:hashValue,temp,nums,int,递增,力扣,vector,序列,491
From: https://www.cnblogs.com/yaocy/p/16742138.html

相关文章

  • 力扣做题09. 字符串轮转
    这题还是比较简单的,用两个指针,进行循环比较 执行结果:通过执行用时:60ms,在所有 JavaScript 提交中击败了70.76%的用户内存消耗:41.5MB,在所有 JavaScript 提......
  • 力扣202(java&python)-快乐数(简单)
    题目:编写一个算法来判断一个数n是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,......
  • 力扣
    1、如果需要考虑之前的状态就可以使用有限状态机有限状态机:  Leecode第8题:  classA:def__init__(self):self.sign=1self.ans=0......
  • 力扣349(java&python)-两个数组的交集(简单)
    题目:给定两个数组 nums1 和 nums2,返回它们的交集 。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。 示例1:输入:nums1=[1,2,2,1],num......
  • 力扣做题 09. 第 k 个数
    这题主要难度还是理解题意,找到规律,以及实践 有些数的素因子只有3,5,7,请设计一个算法找出第k个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数......
  • 动态规划之最长递增子序列
    给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1......
  • P2491 [SDOI2011] 消防
    P2491SDOI2011消防算法竞赛进阶指南P374解法3(解法2为P1099树网的核),7FA4.3.2.5.3,LuoguP2491SDOI2011二分答案mid在树的直径上找离两端最远且距离小于mid......
  • 力扣刷题详解(含代码动态展示)
    (文章目录)一、448.找到所有数组中消失的数字给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数......
  • 单链表的递增排序
    voiesort(LinkList&L){LNode*p=L->next;LNode*pre;LNode*r=p->next;p->next=NULL;p=r;while(p!=NULL){r=p......
  • 力扣算法第1题--两数之和(暴力题解&优化题解)
    两数之和题目描述:给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输......