力扣奇遇记 [第一章]

文章目录

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


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

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

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

题目

有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。
在一步操作中,你可以将 一个 小球从某个盒子移动到一个与之相邻的盒子中。第 i 个盒子和第 j 个盒子相邻需满足 abs(i - j) == 1 。注意,操作执行后,某些盒子中可能会存在不止一个小球。
返回一个长度为 n 的数组 answer ,其中 answer[i] 是将所有小球移动到第 i 个盒子所需的 最小 操作数。
每个 answer[i] 都需要根据盒子的 初始状态 进行计算。


示例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函数,它的作用是相当于绝对值的作用。

力扣奇遇记 [第一章]_第1张图片

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


代码产出:

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
目标下标 是一个满足 nums[i] == target 的下标 i 。
nums 按 非递减 顺序排序后,返回由 nums 中目标下标组成的列表。如果不存在目标下标,返回一个 空 列表。返回的列表必须按 递增 顺序排列。


示例1

输入:nums = [1,2,5,2,3], target = 2
输出:[1,2]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 2 的下标是 1 和 2 。

示例2

输入:nums = [1,2,5,2,3], target = 3
输出:[3]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 3 的下标是 3 。

示例3

输入:nums = [1,2,5,2,3], target = 5
输出:[4]
解释:排序后,nums 变为 [1,2,2,3,5] 。
满足 nums[i] == 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刷题都属于是接口型函数,所以我们呢不用去管那些函数的调用去包那些头文件,


代码产出:

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;
}
}

你可能感兴趣的:(LeetCode刷题集,leetcode,算法,职场和发展,c++)