该题的难点在于判断元素是否用过
class Solution {
List<List<Integer>> usre=new ArrayList<>();
ArrayList<Integer> sad=new ArrayList();
public List<List<Integer>> findSubsequences(int[] nums) {
isado(nums,0);
return usre;
}
public void isado(int [] nums,int index)
{
if(sad.size()>1)
{
usre.add(new ArrayList<>(sad));
}
HashSet<Integer> dsf=new HashSet<>();
for(int i=index;i<nums.length;i++)
{
if(!sad.isEmpty()&&sad.get(sad.size()-1)>nums[i]||dsf.contains(nums[i]))
{
continue;
}
dsf.add(nums[i]);
sad.add(nums[i]);
isado(nums,i+1);
sad.remove(sad.size()-1);
}
}
}
排列问题每次都要从头搜索,说以判断集合内是否包含将要被搜索的元素,若遍历到要被搜索的元素,那就跳过
class Solution {
List<List<Integer>> result=new ArrayList<>();
LinkedList<Integer> ewas=new LinkedList();
public List<List<Integer>> permute(int[] nums) {
fewa(nums,ewas);
return result;
}
public void fewa(int [] nums,LinkedList<Integer> ewas)
{
if(ewas.size()==nums.length)
{
result.add(new ArrayList(ewas));
}
for(int i=0;i<nums.length;i++)
{
if(ewas.contains(nums[i]))
{
continue;
}
ewas.add(nums[i]);
fewa(nums,ewas);
ewas.removeLast();
}
}
}
此题相较于上一题的难点是在于去重,这里在于的是每一层的去重。
class Solution {
List<List<Integer>> result=new ArrayList();
LinkedList<Integer> ewsa=new LinkedList();
public List<List<Integer>> permuteUnique(int[] nums) {
boolean [] used=new boolean[nums.length];
for (int i = 0; i < nums.length; i++) { //长度不减1,是因为要留多一个位置方便插入数
//定义待插入的数
int insertValue=nums[i];
//找到待插入数的前一个数的下标
int insertIndex=i-1;
while (insertIndex>=0 && insertValue <nums[insertIndex]) {//拿a[i]与a[i-1]的前面数组比较
nums[insertIndex+1]=nums[insertIndex];
insertIndex--;
}
nums[insertIndex+1]=insertValue;
}
sadwa(nums,used);
return result;
}
public void sadwa(int [] nums,boolean [] used)
{
if(ewsa.size()==nums.length)
{
result.add(new ArrayList(ewsa));
return;
}
for(int i=0;i<nums.length;i++)
{
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false)
{
continue;
}
if(used[i]==false)
{
used[i]=true;
ewsa.add(nums[i]);
sadwa(nums,used);
ewsa.removeLast();
used[i]=false;
}
}
}
}
总结:今天的有点难。