【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #

简介: 【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #

前言


有些简单题在leetcode上实际上不简单,相信大家有和我相同的感觉。

(/(ㄒoㄒ)/~~)

下面是我认为真正符合简单一词的三个题目,我来分享以下我的解体思路。


1. 第35题:搜索插入位置


给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。


【示例 1】:


输入: nums = [1,3,5,6], target = 5

输出: 2


【示例 2】:


输入: nums = [1,3,5,6], target = 2

输出: 1


【示例 3】:


输入: nums = [1,3,5,6], target = 7

输出: 4


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/search-insert-position


题目意思很明确,给定一个升序数组和一个目标值,如果数组中某个元素和目标值相等,返回其下标。


如果 目标值不存在于数组中,返回他将会按顺序插入的位置,也就是说,示例2中 (目标值2) 在数组中的元素1和3之间,所以2应当被认为插入1和3之间,然后返回其下标,也就是1。


示例3为例外,就是目标值比所有数组里的元素都要大,这时认为目标值放在数组的最后一个元素的后面,再返回其下标,也就是整个数组的大小。


以下是代码实现:

int searchInsert(int* nums, int numsSize, int target){
    int i = 0;
    for (i = 0; i < numsSize; i++)
    {
        if (nums[i] == target || nums[i] >= target) // 判断是否相等或者是否小于等于后一个元素
        {
            return i;
        }
    }
    return numsSize; // 如果上面循环结束都不成立,那么就是数组中没有目标值且该值比数组中所有的元素都要大。所以直接放在数组最大的元素的后面,也就是要返回数组的大小。
}


我们可以用一个循环来遍历数组,如果数组元素与目标值相等,直接返回其下标。

如果目标值刚好比升序数组的一个元素小或相等,则返回这个元素的下标(可以说是目标值把这个元素挤开占有其下标)。

如果循环内条件都不成立,在后面直接return数组的大小(目标值可以直接放在后面)。


2. 第258题:各位相加


  • 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
  • 【示例 1】:
    输入: num = 38
  • 输出: 2
    解释: 各位相加的过程为:
    38 --> 3 + 8 --> 11
    11 --> 1 + 1 --> 2
    由于 2 是一位数,所以返回 2。
  • 【示例 2】:
    输入: num = 0
    输出: 0


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/add-digits


由示例1不难看出,我们要重复将一个数的各个位相加直到这个数为一位数为止,由38为例,先相加每一位也就是3与8相加得到一个新的数11,此时判断11他不是1位数,那么此时继续相加每一位,也就是1与1相加得到2,这时判断2为1位数,那么return这个一位数也就是2;

那么我们如何来使这个数的每一位相加呢?如果这个数不是38而是更多位数的数来每一位相加,这时又该怎么处理?本人用的是递归的思想来使其每一位相加,并且可以解决数的位数变化的问题。


先看代码:

int add_num(int n) // 进入递归函数
{
    if (n > 0) 
    {
        return n % 10 + add_num(n / 10); //递归
    }
    else
    {
        return 0;
    }
}
int addDigits(int num){
    while (num > 9) //如果num不是一位数就一直循环
    {
        num = add_num(num); //每循环一次各位相加一次,num的值就要变化
    }
    return num; //返回最终相加为一位数的num
}


  • 递归阶段:(num % 10)得到第一位数,再传(num / 10) 进入函数(除去加了的那一位),也就是前面的(num % 10)将要与第二位数相加,依次类推,当(num = 0)时返回0,实现每一位的相加。
  • 当 num = 0 时,while循环进不去,直接就返回num。


3. 第724: 寻找数组的中心下标


给你一个整数数组 nums ,请计算数组的 中心下标 。


数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。


如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。


如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 - 1 。


【示例 1】:


输入:nums = [1, 7, 3, 6, 5, 6]

输出:3

解释:

中心下标是 3 。

左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,

右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。


【示例 2】:


输入:nums = [1, 2, 3]

输出:-1

解释:

数组中不存在满足此条件的中心下标。


【示例 3】:


输入:nums = [2, 1, -1]

输出:0

解释:

中心下标是 0 。

左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),

右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/find-pivot-index


这一题的题目明显要比上面两个题的题目要复杂,其意思其实就是:在数组的元素中,存在一个元素使得除其本身元素之外的左边的所有元素之和等于右边的所有元素之和,这时就称该元素的下标为数组的中心下标。


我们要注意最左边和最右边的情况;


要注意有多个中心下标时,返回最靠数组左边的下标,这里我们可以大致确定判断路径:遍历数组判断其每一个元素的左右边元素之和是否相等,那么如何来判断?

中心下标的左边所有元素和右边所有元素之和相等,从这点出发,可以得到 中心下标左边的所有元素之和乘以二再加上中心下标元素的值是等于整个数组的元素之和的,就根据这点,判断的条件就是:中心下标左边的所有元素的和×2 + 中心下标的值 =?所有元素的和 (或者)所有元素的和减去中心下标的值是否等于中心下标左边所有的元素之和×2。


以下是代码实现:

int pivotIndex(int* nums, int numsSize) {
    int sum = 0,n = 0;
    for(int i = 0;i < numsSize;i++)
        sum = sum + nums[i];  //首先求出所有元素的和
    for(int i = 0;i < numsSize;i++){
        if(n * 2 == sum - nums[i]) //n开始为0就解决了在最左边的情况
            return i;              //减去nums[i]相当于减去中心下标的元素
        n = n + nums[i]; //每判断到下一个元素,讲左边元素的值加起来,相当于求中心下标左边所有元素之和
    }
    return -1; // 如果上面for循环都跳出没有返回,则返回-1(说明没有中心下标)。
}


  • 这是一个比较灵活的解法,相信大家一定还有更灵活的解法,把它留在评论区吧!


总结


leetcode上的题比较逻辑思维,算法能力和语法熟练度,每天都去动动自己的大脑,相信不久你就会从小白变为大白的!

相关文章
|
7天前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
|
9天前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
|
28天前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
248 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
10天前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。
|
5月前
|
存储 算法 调度
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
159 24
|
5月前
|
人工智能 自然语言处理 算法
阿里云 AI 搜索开放平台:从算法到业务——AI 搜索驱动企业智能化升级
本文介绍了阿里云 AI 搜索开放平台的技术的特点及其在各行业的应用。
627 3
|
1月前
|
机器学习/深度学习 并行计算 算法
MATLAB实现利用禁忌搜索算法解决基站选址问题
MATLAB实现利用禁忌搜索算法解决基站选址问题
56 0
|
2月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
128 0
|
7月前
|
机器学习/深度学习 算法
算法系列之搜索算法-深度优先搜索DFS
深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索,直到到达顶点。深度优先搜索会沿着一条路径不断的往下搜索,直到不能够在继续为止,然后在折返,开始搜索下一条候补路径。
410 62
算法系列之搜索算法-深度优先搜索DFS
|
3月前
|
机器学习/深度学习 算法 数据可视化
基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
本内容展示了基于Q-learning算法的机器人迷宫路径搜索仿真及其实现过程。通过Matlab2022a进行仿真,结果以图形形式呈现,无水印(附图1-4)。算法理论部分介绍了Q-learning的核心概念,包括智能体、环境、状态、动作和奖励,以及Q表的构建与更新方法。具体实现中,将迷宫抽象为二维网格世界,定义起点和终点,利用Q-learning训练机器人找到最优路径。核心程序代码实现了多轮训练、累计奖励值与Q值的可视化,并展示了机器人从起点到终点的路径规划过程。
121 0

热门文章

最新文章