LeetCode 47

news/2024/10/23 7:22:54/


      这个题是对上一个题的变形,变化的条件是数组里面可以出现相同的元素,这样确实加大了难度。不过在上个题的基础上我们可以把精力主要放在怎么处理重复的数字。如果没有记错,我们之前的一道题也是类似情况,我看了一下是 LeetCode 40 ,那个题是nsum问题,这里我们还是可以借鉴那种思想去处理重复的数字,我们还是用 prev 变量来保存已经使用过的值,下次遇到相同的值的时候我们就可以直接跳过,利用这样的方法来过滤掉重复的情况。思想和上个题大致相同,所以我就不再详细说明了。

     代码:

class Solution {
public:vector<vector<int>> permuteUnique(vector<int>& nums) {vector<vector<int>> ret;ret.clear();if (nums.size() == 0){}else if (nums.size() == 1){vector<int> tmp;tmp.push_back(nums[0]);ret.push_back(tmp);}else{// 排序数组,便于过滤重复数字sort(nums.begin(), nums.end());// 数组的元素的个数满足递归要求,进行递归求解solves(ret, nums, 0);}return ret;}void solves(vector<vector<int>>& ret, vector<int> nums, int index){if (index > nums.size()){return;}else if (index +1 == nums.size()){vector<int> tmp;for (int i = 0; i < nums.size(); ++i){ // 该情况符合,保存到vector中tmp.push_back(nums[i]);}ret.push_back(tmp);return;}int begin = index;int prev = 0; //保存递归出来的值,用于过滤重复值for (int i = index; i < nums.size(); ++i){if (i != begin){if (nums[i] == nums[begin] || nums[i] == prev){continue;}swap(nums[begin], nums[i]);}solves(ret, nums, index + 1);prev = nums[i];}}
};


最终结果:

 
最后我总结一下这种全排列问题的解法吧:

1. 使用递归求解,这是很容易理解的,这种题使用循环的话就会变得很冗余。

2. 这种题的思想都是将整个问题分为两个部分,就这个题来说吧:题目给定一个数组,我们每层递归都是从现有数字中取出一个,然后将剩下的作为一个整体进行求解,最终规模只剩 1 的时候就可以求出解了。然后递归出来后,将之前取出的数字依次和剩下序列中的数字进行交换然后递归,这样就会考虑到所有情况,而且也比较容易理解。

3.遇到有重复数字出现的情况,先将数组排序,这样有利于处理掉重复数字,重复数字的处理方法是利用一个 prev 变量保存递归返回时”取出的数字“,然后下次遇到和prev 相同的数字的时候就过滤掉(continue),这样重复数字就被处理掉了(这一点如果不理解就看看代码中 prev 是怎么使用的,然后再来看看这一点)


http://www.ppmy.cn/news/535631.html

相关文章

4.17 一

现有一网络拓扑图如上 要求&#xff1a;①AR1 GE000口用接口DHCP分配IP ②AR1001口用全局DHCP分配IP ③各PC间互通 思路&#xff1a; ①想给PC1、2分配IP需要进入充当DHCP服务器的AR1的000端口配置IP&#xff0c;启用DHCP协议&#xff0c;配置接口地址池并调用。无需配置IP和…

【LeetCode】477. Total Hamming Distance 解题报告(Python C++)

作者&#xff1a; 负雪明烛 id&#xff1a; fuxuemingzhu 个人博客&#xff1a; http://fuxuemingzhu.cn/ 目录 题目描述题目大意解题方法位运算 日期 题目地址&#xff1a;https://leetcode.com/problems/total-hamming-distance/description/ 题目描述 The Hamming distanc…

【Leetcode】477. Total Hamming Distance

方法一&#xff1a; 思路&#xff1a; (1)遍历数组nums&#xff0c;对每一个nums[i]&#xff0c;求其余后面的每一个nums[j]的Hamming Distance。 (2)求x与y的Hamming Distance的方法&#xff1a; ---1)先求x^y的结果res。 ---2)再依次求32位res的每一位与1进行与操作的结…

Codeforces Round #477 C. Stairs and Elevators

Codeforces Round #477 C. Stairs and Elevators 题目链接 题意&#xff1a;给你一栋高n层&#xff0c;每一层由m个部分组成&#xff0c;可以看成是一个矩阵划分成行和列。给你一cl,ce分别表示有个楼梯和电梯&#xff0c;然后给你一个v表示电梯的速度。接下来行表示每个电梯…

[477]tf.reduce_mean()

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴&#xff08;tensor的某一维度&#xff09;上的的平均值&#xff0c;主要用作降维或者计算tensor&#xff08;图像&#xff09;的平均值。 reduce_mean(input_tensor,axisNone,keep_dimsFalse,nameNone,reduction_indices…

LeetCode_位运算_中等_477.汉明距离总和

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 两个整数的汉明距离指的是这两个数字的二进制数对应位不同的数量。 给你一个整数数组 nums&#xff0c;请你计算并返回 nums 中任意两个数之间汉明距离的总和。 示例 1&#xff1a; 输入&#xff1a;nums …

LeetCode | 477. Total Hamming Distance

题目 The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given an integer array nums, return the sum of Hamming distances between all the pairs of the integers in nums. Example 1: Input: n…

【博客477】prometheus-----数值数据编码(varint与zigzag)

prometheus-----数据编码(varint与zigzag) prometheus对数值数据进行编码时&#xff0c;使用到了varint与zigzag varint与zigzag编码方法在protobuf中也被使用 prometheus encoding代码&#xff1a; https://github.com/prometheus/prometheus/blob/main/tsdb/encoding/encodi…