Day1 27删除元素--浣熊鱼

初版代码:

存在问题如下

  1. 循环边界问题:在循环中,你使用了一个索引变量i来遍历数组nums,但在循环体内部又定义了一个新的索引变量index并且增加了它的值。这可能导致你在数组范围之外访问内存,可能会引发未定义行为。

  2. ---index作为int类型,其本身数值增减并不会导致错误,但我用index来当计步器,记录将若*p1==val时之后位置找到的第一个*p2值的位置;但这里忘了一个问题就是for循环是重复numsSize次数的,而随着每次移除元素,newlengs新的数组长度会减少,那么定义index=i+1;就会发生数组越界,指针将移动未定义区域的内存空间。

  3. 指针操作问题:在内层循环中,你使用指针p2来查找连续的相同值,并将其替换为下一个不同的值。但是,在进行指针操作时,没有检查是否超出了数组边界。这可能导致指针越界访问,从而引发内存访问错误。

  4. 循环中的内存操作:在循环的最后部分,你使用指针p2tmp进行数组元素的移动操作。然而,在移动元素之前,没有检查指针是否超出了数组边界。这可能导致在移动元素时访问了无效的内存位置。

int removeElement(int* nums, int numsSize, int val){
    int*p1,*p2;
    p1=p2=nums;
    int newlens=numsSize;//记录剩余长度
    for (int i=0; i<numsSize; i++) {
        int index=i+1;
        if(*p1==val)
        {
            p2=p1+1;
            index++;
            while (*p2==val) {
                p2++;
                index++;//找到p1后第一个不为val的位置
            }
            *p1=*p2;//p2替换p1的值
            for (int j=0; j<newlens-index;j++) {
                int*tmp=p2+1;
                *p2=*tmp;
                tmp++;
                p2++;
                
            }//数组前移完毕
            newlens--;
        }
        p1++;
    }
    return newlens;
}

修改之后的代码:

int removeElement(int* nums, int numsSize, int val) {
    int* p1 = nums;
    int* p2 = nums;
    int newLength = numsSize;

    for (int i = 0; i < numsSize; i++) {
        if (*p1 == val) {
            p1++;
            newLength--;
        } else {
            *p2 = *p1;
            p1++;
            p2++;
        }
    }

    return newLength;
}

修改思路如下:

  1. 使用两个指针p1p2分别指向原始数组中的元素。p1用于遍历数组中的元素,而p2用于指示下一个不等于目标值的位置。

  2. p1指向的元素等于目标值时,将p1向后移动一位,而newLength减一表示忽略一个重复的元素。

  3. p1指向的元素不等于目标值时,将该元素复制到p2的位置,同时将p1p2都向后移动一位。

  4. 最后返回新长度newLength

--我使用的是暴力算法,在找到第一个目标元素时,就将后续数组挨个前移覆盖;同样是双指针,一个指针用于遍历数组,另外一个指针用于将元素前移。时间复杂度为O(n^2)

时间复杂度更低的是“快慢指针方法

快慢指针遍历数组

如果不是目标元素,指针同时前移;

当遇到目标元素,慢指针停下,快指针前移,直到遇到第一个不为目标元素的内存空间,将*p2=*p1后lens--;快慢指针再前移。当p1遍历完数组后,慢指针所在位置就是新数组结束的位置,下标也对应着新的数组长度。

浣熊优化算法(Raccoon Optimization Algorithm, ROA)是一种基于生物启发的优化搜索算法,灵感来源于浣熊在捕食过程中的灵活策略。该算法通过模拟浣熊的行为模式,包括探索性和局部搜索特性,在解决复杂优化问题时寻找解决方案。 在Python中实现浣熊优化算法通常需要以下几个步骤: 1. **导入库**:首先,你需要安装必要的优化库,如`deap`(Distributed Evolutionary Algorithms in Python),它提供了解决进化计算问题的基础框架。 ```python import numpy as np from deap import base, creator, tools ``` 2. **定义种群和个体**:创建种群对象,并定义每个个体的特征(通常是函数的输入变量及其目标值)。 ```python creator.create("FitnessMax", base.Fitness, weights=(1.0,)) creator.create("Individual", list, fitness=creator.FitnessMax) ``` 3. **初始化算法参数**:设置迭代次数、种群大小等。 4. **浣熊行为模型**:实现觅食、捕获和休息操作,随机选择操作并更新个体位置。 5. **适应度评估**:对于每次迭代后的个体,计算其对应的目标函数值,更新适应度。 6. **选择和交叉**:应用遗传算法的自然选择和重组操作。 7. **迭代和终止条件**:当达到预设的迭代次数或者适应度不再改进时,结束算法。 下面是一个简化的示例代码片段: ```python def roa_search(func, n_var, n_iter): # ... (其他配置) def select_and_feed(best_individuals, new_population_size): # ... (选择和喂养操作) for _ in range(n_iter): new_population = [] # ... (执行浣熊操作) # 更新种群 pop = select_and_feed(pop, len(pop)) best_solution = tools.selBest(pop, 1)[0] return best_solution, func(best_solution) # 示例: func = lambda x: x[0]**2 + x[1]**2 best_solution, min_value = roa_search(func, 2, 100) # 二维优化,100次迭代
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值