Day1代码随想录打卡--浣熊鱼

1.704二分查找

二分查找的 框架:

int binarySearch(int[] nums, int target)

{

int left = 0, right = ...;

while(...)

{

int mid = left + (right - left) / 2;

if (nums[mid] == target) { ... }

else if (nums[mid] < target) { left = ... }

else if (nums[mid] > target) { right = ... }

}

return ...;

}

1.主体while(...)循环的条件判断不知道该写什么:

最初的想法是写判断nums[mid]==target 但又很疑惑 因为如果未找到目标的话就是死循环了

实在不知该怎么写--去看了答案之后应该与left<right有关

但我以为left应该恒小于right

仔细想了一下 假设target在靠数组左边区域,那么前面几次nums[mid]都是大于target,

(这里不妨假设nums: 1 2 4 target为3 左闭右闭区间)判断条件是:left<=right

mid=2--->num[2]=4>3--->right=mid-1=1--->(下一轮循环)mid=0--->num[0]=1<3--->left=mid+1=1--->条件判断left>right 退出循环

即判断条件中如果target不在数组中,循环过程中left/right就会越过target导致left right左右颠倒 退出循环

2.mid为什么是left+(right-left)/2而不是(left+right)/2

调试的时候int mid=(left+right)/2 运行时长比left+(right-left)/2时间慢

应当考虑当right足够大时,left+right可能结果太大 导致溢出

3.应用二分法的条件

适用于无重复数组

区间为左开右闭

#include <stdio.h>

//*nums数组指针,numsSize数组大小,target目标数字

int search(int* nums, int numsSize, int target){

    int left=0;

    int right=numsSize-1;

    //区间为左闭右开

    while (left<right) {

        int mid=left + (right-left)/2;

        if(nums[mid]==target)return mid;

        else if (nums[mid]>target)

        {

            right=mid;//右为开区间 如果是mid-1 前一个元素可能为target不被取到 所以右边界改为mid

        }

        else if (nums[mid]<target)left=mid+1;

    }

    return -1;

}

左闭右闭

int search01(int* nums, int numsSize, int target){

    //左闭右闭

    int left=0;

    int right=numsSize-1;

    while (left<=right)//左闭右闭区间 [a,b]定义可以a=b

    {

        int mid=left + (right-left)/2;

        if(nums[mid]==target)return mid;

        else if (nums[mid]>target)

        {

            right=mid-1;

        }

        else if (nums[mid]<target)left=mid+1;

    }

    return -1;

}

浣熊优化算法(Raccoon Optimization Algorithm,ROA)是一种仿生优化算法,灵感来源于浣熊的觅食行为。下面是一个简单的浣熊优化算法的 MATLAB 代码示例: ```matlab % 参数设置 maxIter = 100; % 迭代次数 popSize = 50; % 种群大小 dim = 2; % 优化问题的维度 lb = [-10, -10]; % 变量的下界 ub = [10, 10]; % 变量的上界 % 初始化种群 population = lb + (ub - lb) .* rand(popSize, dim); % 计算适应度函数值 fitness = calculateFitness(population); % 寻找最优解 [bestFitness, bestIndex] = min(fitness); bestSolution = population(bestIndex, :); % 迭代优化过程 for iter = 1:maxIter % 更新种群 newPopulation = population; for i = 1:popSize % 随机选择两个个体 p1 = randi(popSize); p2 = randi(popSize); % 浣熊的觅食行为 if fitness(p1) < fitness(p2) newPopulation(i, :) = population(i, :) + rand(1, dim) .* (population(p1, :) - population(i, :)); else newPopulation(i, :) = population(i, :) + rand(1, dim) .* (population(i, :) - population(p2, :)); end % 边界处理 newPopulation(i, :) = max(lb, min(ub, newPopulation(i, :))); end % 更新种群适应度 newFitness = calculateFitness(newPopulation); % 更新最优解 [newBestFitness, newBestIndex] = min(newFitness); if newBestFitness < bestFitness bestFitness = newBestFitness; bestSolution = newPopulation(newBestIndex, :); end % 更新种群和适应度 population = newPopulation; fitness = newFitness; end % 适应度函数示例(需根据具体问题自行定义) function fitness = calculateFitness(population) % 计算种群中每个个体的适应度值 fitness = sum(population.^2, 2); % 示例:目标函数为多个变量平方和 end ``` 该代码实现了浣熊优化算法的基本流程,包括种群初始化、适应度计算、迭代优化等步骤。你可以根据具体的优化问题,自行定义适应度函数和问题的维度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值