基于递归的删除数组重复元素

思路分析:
在一个数组一遍扫描,找这个数组里面与item值相同的数组元素,如果找到不能直接让后面的向前覆盖,因为考虑到有可能后面也有和item相同的元素,所以,先将不同的元素向前覆盖,如果找到相同的需要再次执行这个函数,在这里就产生了递归。值得注意的是:当最后一个相等元素找到之后就要像回溯,但是还需要做一个处理。
举例分析
6123145
在1元素的位置进入了递归
要将数组改成
6233145,这个时候,将23元素完成了覆盖,但是在1的位置没有覆盖,当45完事之后,变成了如下情况:
6233455,这个时候细心的观众就会发现,应该是623455,多出了一个3,这个是覆盖的时候所剩的冗余,也是1的位置没办法向前覆盖的原因。
所以增加的操作就是一次递归完成之后,要向前再覆盖一次;
需要注意如果第一个位置就是item则不用覆盖。
还要注意向前覆盖的位点是j,而不是i和s(在代码中体现)
删除之后结果:
数组元素为len(a)-item的数量
并且各元素保持着在原数组中的位置

#include <stdio.h>
#include <stdlib.h>
void dfs(int *a,int s,int item)
{
     
    int flag=0;
    for(int i=s;i<9;i++)
    {

        if(a[i]==item)
        {
            for(int j=i+1;j<9;j++)
            {
                if(a[j]!=item)
                {
                    a[j-1]=a[j];
                }
                 else
                {
                    dfs(a,j,item);
                    flag=1;
                    if(j!=0)//递归出口判断错误,这块是在i循环下找到的j,而我们想利用的值是j
                    for(int u=j-1;u<9;u++)
                    {
                        a[u-1]=a[u];
                    }
                    }
                     if(flag==1)
                          break;
                }
        }
        if(flag==1)
            break;
    }
 
    return;
}
int main()
{
    int a[9]={1,2,1,2,3,2,1,3,2};
    dfs(a,0,1);
    for(int i=0;i<9;i++)
        printf("%d ",a[i]);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用回溯算法来解决这个问题。具体步骤如下: 1. 定义一个变量 `n` 表示要取得的组合数量,以及一个列表 `res` 用于存储结果。 2. 定义一个递归函数 `backtrack(comb, idx)`,其中 `comb` 表示当前已经组合的元素,`idx` 表示当前处理的数组的下标。 3. 如果 `len(comb) == n`,说明已经取得了足够的组合,将 `comb` 添加到 `res` 中并返回。 4. 如果 `idx == len(arr)`,说明当前数组已经处理完毕,直接返回。 5. 在当前数组中循环遍历,每次将当前元素添加到 `comb` 中,并递归调用 `backtrack(comb, idx+1)` 处理下一个数组。 6. 在递归调用返回后,将 `comb` 中最后一个元素删除,继续遍历下一个元素进行回溯。 下面是基于 Python 的回溯算法实现: ```python def combine(arrs, n): res = [] def backtrack(comb, idx): if len(comb) == n: res.append(comb[:]) return if idx == len(arrs): return for i in range(len(arrs[idx])): comb.append(arrs[idx][i]) backtrack(comb, idx+1) comb.pop() backtrack([], 0) return res ``` 其中 `arrs` 是一个包含多个数组的列表,`n` 表示要取得的组合数量。调用示例: ```python arrs = [[1,2,3], [4,5], [6,7,8,9]] n = 3 res = combine(arrs, n) print(res) # [[1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 5, 6], [1, 5, 7], [1, 5, 8], [1, 5, 9], [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 5, 6], [2, 5, 7], [2, 5, 8], [2, 5, 9], [3, 4, 6], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 5, 6], [3, 5, 7], [3, 5, 8], [3, 5, 9]] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值