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

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

前言


有些简单题在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上的题比较逻辑思维,算法能力和语法熟练度,每天都去动动自己的大脑,相信不久你就会从小白变为大白的!

相关文章
|
14天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
58 23
|
23小时前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。
|
4月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
58 0
|
4月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
72 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
3月前
|
算法 搜索推荐 数据库
二分搜索:高效的查找算法
【10月更文挑战第29天】通过对二分搜索的深入研究和应用,我们可以不断挖掘其潜力,为各种复杂问题提供高效的解决方案。相信在未来的科技发展中,二分搜索将继续发挥着重要的作用,为我们的生活和工作带来更多的便利和创新。
81 1
|
4月前
|
算法 决策智能
基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
该程序基于禁忌搜索算法求解车辆路径问题(VRP),使用MATLAB2022a版本实现,并带有GUI界面。用户可通过界面设置参数并查看结果。禁忌搜索算法通过迭代改进当前解,并利用记忆机制避免陷入局部最优。程序包含初始化、定义邻域结构、设置禁忌列表等步骤,最终输出最优路径和相关数据图表。
|
4月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
50 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
5月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
86 2
|
4月前
|
存储 算法 C++
【搜索算法】 跳马问题(C/C++)
【搜索算法】 跳马问题(C/C++)
|
4月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)

热门文章

最新文章