力扣奇遇记 [第一章]

文章目录

  • [😦第一题:拿下LeetCode1769. 移动所有球到每个盒子所需的最小操作数](#😦第一题:拿下LeetCode1769. 移动所有球到每个盒子所需的最小操作数)
    • [学习内容:LeetCode1769. 移动所有球到每个盒子所需的最小操作数](#学习内容:LeetCode1769. 移动所有球到每个盒子所需的最小操作数)
    • 🙈思路分析:
    • 💖代码产出:
  • [😦第二题:拿下2089. 找出数组排序后的目标下标](#😦第二题:拿下2089. 找出数组排序后的目标下标)

😦第一题:拿下LeetCode1769. 移动所有球到每个盒子所需的最小操作数

  • 😤 学完本章节知识即可掌握本题!

学习内容:LeetCode1769. 移动所有球到每个盒子所需的最小操作数

😤题目

有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxesi 的值为 '0' 表示第 i 个盒子是 空 的,而 boxesi 的值为 '1' 表示盒子里有 一个 小球。

在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。

返回一个长度为 n 的数组 answer ,其中 answeri 是将所有小球移动到第 i 个盒子所需的 最小 操作数。

每个 answeri 都需要根据盒子的 初始状态 进行计算。


示例1

输入:boxes = "110"

输出:1,1,3

解释:每个盒子对应的最小操作数如下:

  1. 第 1 个盒子:将一个小球从第 2 个盒子移动到第 1 个盒子,需要 1 步操作。
  2. 第 2 个盒子:将一个小球从第 1 个盒子移动到第 2 个盒子,需要 1 步操作。
  3. 第 3 个盒子:将一个小球从第 1 个盒子移动到第 3 个盒子,需要 2 步操作。将一个小球从第 2 个盒子移动到第 3 个盒子,需要 1 步操作。共计 3 步操作。

示例2

输入:boxes = "001011"

输出:11,8,5,4,3,4


🙈思路分析:

根据本题目的描述,我想到一种很暴力的方法,在这一题中这道力扣题目处于中等题,但是却可以用我这种暴力法解开我觉得有点意外hhh!

时间复杂度 O(N^2)
空间复杂度 O(N)

我们先来看示例1,这里我采用的是两层for循环大法,第一层for用来遍历固定的箱子,因为在题目的示例中我们发现在每一个位置上都需要有球进去所以第一层我们确定用来定义稳定的球数,然后我们根据题目还可以知道只有位置上有1才需要把球移动过去,所以我们第二层for用来判断当前位置是否为1,这里我们还需要利用一个函数叫abs函数,它的作用是相当于绝对值的作用。

💖此时我们就可以开始编写代码啦!但是这里我们要注意在LeetCode刷题都属于是接口型函数,所以我们呢不用去管那些函数的调用去包那些头文件,


💖代码产出:

c 复制代码
int* minOperations(char * boxes, int* returnSize){
    int len = strlen(boxes);
    *returnSize = len;
    int sum = 0;
    int* answer = (int*)malloc(sizeof(int) * (*returnSize));
    for(int i = 0;boxes[i] != '\0';i++)
    {
        sum = 0;
        for(int j = 0;boxes[j] != '\0';j++)
        {
            if((boxes[j] - '0') == 1)
            {
                sum += abs(j - i);
            }
        }
        answer[i] = sum;
    }
    return answer;
}

😦第二题:拿下2089. 找出数组排序后的目标下标

  • 😤 学完本章节知识即可掌握本题!

学习内容: 拿下2089. 找出数组排序后的目标下标

😤题目

给你一个下标从 0 开始的整数数组 nums 以及一个目标元素 target

目标下标 是一个满足 numsi == target 的下标 i 。

nums 按 非递减 顺序排序后,返回由 nums 中目标下标组成的列表。如果不存在目标下标,返回一个 空 列表。返回的列表必须按 递增 顺序排列。


示例1

输入:nums = 1,2,5,2,3, target = 2

输出:1,2

解释:排序后,nums 变为 1,2,2,3,5

满足 numsi == 2 的下标是 1 和 2 。

示例2

输入:nums = 1,2,5,2,3, target = 3

输出:3

解释:排序后,nums 变为 1,2,2,3,5

满足 numsi == 3 的下标是 3 。

示例3

输入:nums = 1,2,5,2,3, target = 5

输出:4

解释:排序后,nums 变为 1,2,2,3,5

满足 numsi == 5 的下标是 4 。

示例4

输入:nums = 1,2,5,2,3, target = 4

输出:\[\]

解释:nums 中不含值为 4 的元素。


🙈思路分析:

根据本题目的描述,我先想到的是利用c语言里面的qsort库函数,先快速排序一下,此时的数组就是有序的了。之后在一次遍历找到下标即可

时间复杂度 O(N)
空间复杂度 O(N)

我们先来看示例1,这里先是利用排序把数组排成了升序,第一个for循环是先找到数组中与target相同的数有几个,然后在进行动态开辟数组,第二个for循环就是依次把与target相同数的下标放进ret数组中,最后在返回ret即可

在这里插入图片描述

💖此时我们就可以开始编写代码啦!但是这里我们要注意在LeetCode刷题都属于是接口型函数,所以我们呢不用去管那些函数的调用去包那些头文件,


💖代码产出:

c 复制代码
int compare(const void* a,const void* b)
{
    return *(int*)a - *(int*)b;
}
int* targetIndices(int* nums, int numsSize, int target, int* returnSize){
    int ans = 0;
    qsort(nums,numsSize,sizeof(int),compare);
    for(int i = 0;i < numsSize;i ++)
    {
        if(nums[i] == target)
            ans ++;
    }
    *returnSize = ans;
    int* ret = (int*)malloc(sizeof(int) * *returnSize);
    int j = 0;
    for(int i = 0;i < numsSize;i ++)
    {
        if(nums[i] == target)
        {
            ret[j++] = i;
        }
    }
    return ret;
}
}
相关推荐
郝学胜-神的一滴8 小时前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
星恒随风8 小时前
C++ STL 详解:list 的使用、迭代器失效、模拟实现与 vector 对比
开发语言·数据结构·c++·笔记·学习·list
退休倒计时8 小时前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
小白说大模型8 小时前
AI Agent 调试实战:链路追踪、Prompt 可视化与异常定位的系统方法
java·人工智能·python·算法·prompt
梅梅绵绵冰8 小时前
算法题-矩阵
数据结构·算法·矩阵
牢姐与蒯8 小时前
c++之异常
开发语言·c++·c++11
此生决int8 小时前
深入理解C++系列(02)——类和对象(上)
开发语言·c++
atunet9 小时前
关于从哈希冲突看缓存设计的实践与权衡7
算法
zjun100110 小时前
C++:单例模式
c++·单例模式
GuWenyue17 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法