算法练习----力扣每日一题------1

原题链接:

2908. 元素和最小的山形三元组 I - 力扣(LeetCode)

题目解读:

        给定一个整数数组nums,如果下标i,j,k满足

  • i<j<k
  • nums[i]<num[j]并且nums[k]<num[j]

则称为山型三元组,返回所有山型三元组中nums[i]+num[j]+num[k]最小的值。如果没有山型三元组返回 -1

  • 3 <= nums.length <= 50
  • 1 <= nums[i] <= 50

解法一:暴力遍历

        对i,j,k 的组成的所有情况进行测试

class Solution {
public:
	int minimumSum(vector<int>& nums) {
		int size = nums.size();
		int i, j, k;
		int ret = INT_MAX;

		//三层暴力循环
		for (i = 0; i < size; i++)
		{
			for (j = i + 1; j < size; j++)
			{
				for (k = j + 1; k < size; k++)
				{
					//if判断为真的话为山型三元组
					if (nums[i] < nums[j] && nums[k] < nums[j])
						ret = min(ret, nums[i] + nums[j] + nums[k]);//如果新的三元组和大于ret,更新ret的值

				}
			}
		}
		//如果ret==INT_MAX证明没有合法的三元组,返回 -1
		if (ret == INT_MAX)
			return -1;
		else
			return ret;
	}
};

时间复杂度o(n^3)

空间复杂度o(1)

解法二:前缀和+后缀和

        当j=a时,数组元素中只有从0下标到a-1下标的最小元素和从a+1下标到n-1下标的最小元素是有意义的元素。在暴力解法中,我们相当于是通过遍历i和k的所有情况来寻找这两个值,遍历过程中进行了大量可避免的计算,我们可以通过将不同下标对应的两个最小值提前求出来,并存储在数组中来提高运行效率

 Solution {
public:
	int minimumSum(vector<int>& nums) {
		const int size = nums.size();
		int ret = INT_MAX;
		//如果ret==INT_MAX证明没有合法的三元组,返回 -1
		int left[55];
		int right[55];
		//left记录对于任意下标左侧的最小值
		left[0] = nums[0];
		for (int i = 1; i < size - 1; i++)
		{
			left[i] = min(nums[i - 1], left[i - 1]);
		}
		//right记录对于任意下标右侧的最小值
		right[size - 1] = nums[size - 1];
		for (int i = size - 2; i > 0; i--)
		{
			right[i] = min(right[i + 1], nums[i]);
		}
		for (int j = 1; j < size - 1; j++)
		{
			if (left[j] < nums[j] && right[j] < nums[j])
				ret = min(ret, nums[j] + left[j] + right[j]);
		}	
        if (ret == INT_MAX)
			return -1;
		else
			return ret;
	}
};

时间复杂度o(n)

空间复杂度o(n)


对解法二的适当轻微优化

对于解法二来说,可以看出生成left数组和循环j是十分相似的,理论上来说他们是可以写在一起的向下面这样。

for (int j = 1; j < size - 1; j++)
        {

            left[j] = min(nums[j - 1], left[j - 1]);
            if (left[j] < nums[j] && right[j] < nums[j])
                ret = min(ret, nums[j] + left[j] + right[j]);
        }

        对于此时的left数组来说,有意义的值只有left[j]和left[j-1]这两个值,如果想想办法用两个单独的数来表示left[j]和left[j-1],就可以将一个数组优化为两个值。

        其实left[j-1]可以看做left[j]的上一次的状态。我这边就用一个整数left来代替left数组。

class Solution {
public:
	int minimumSum(vector<int>& nums) {
		const int size = nums.size();
		int ret = INT_MAX;
		//如果ret==INT_MAX证明没有合法的三元组,返回 -1
		int right[50];
		//right记录对于任意下标右侧的最小值
		right[size - 1] = nums[size - 1];
		for (int i = size - 2; i > 0; i--)
		{
			right[i] = min(right[i + 1], nums[i]);
		}
		//将left数组优化为l个元素
		int left = 0;
		for (int j = 1; j < size - 1; j++)
		{
			if (nums[left] < nums[j] && right[j] < nums[j])
				ret = min(ret, nums[j] + nums[left] + right[j]);
			else if (nums[j] < nums[left])
				left = j;
		}
		if (ret == INT_MAX)
			return -1;
		else
			return ret;
	}
};

时间复杂度o(n)

空间复杂度o(n)


感谢观看!!!!!!

相关推荐

  1. 算法练习----每日------1

    2024-03-30 03:52:03       48 阅读
  2. 算法练习----每日------2

    2024-03-30 03:52:03       29 阅读
  3. 算法练习----每日------3

    2024-03-30 03:52:03       40 阅读
  4. 算法练习----每日------5

    2024-03-30 03:52:03       37 阅读
  5. 算法练习----每日------6

    2024-03-30 03:52:03       36 阅读
  6. 算法练习----每日------4

    2024-03-30 03:52:03       42 阅读
  7. 算法练习----每日------7

    2024-03-30 03:52:03       42 阅读
  8. 每日

    2024-03-30 03:52:03       38 阅读
  9. 2024.1.7每日——赎金信

    2024-03-30 03:52:03       65 阅读
  10. 2024.2.1每日——数字游戏

    2024-03-30 03:52:03       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-30 03:52:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-30 03:52:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-30 03:52:03       82 阅读
  4. Python语言-面向对象

    2024-03-30 03:52:03       91 阅读

热门阅读

  1. 阳光消费金融2023利润创新高,固收业务立功

    2024-03-30 03:52:03       40 阅读
  2. Gitea 的简单介绍

    2024-03-30 03:52:03       40 阅读
  3. C#——系统学习(LINQ)

    2024-03-30 03:52:03       40 阅读
  4. linux下守护进程supervisor

    2024-03-30 03:52:03       48 阅读
  5. linux ln Linux 系统中用于创建链接(link)的命令

    2024-03-30 03:52:03       51 阅读
  6. 【代码随想录】day24

    2024-03-30 03:52:03       43 阅读
  7. Kafka学习之:mac 上安装 kafka

    2024-03-30 03:52:03       41 阅读
  8. docker centos7在线安装mysql8.x

    2024-03-30 03:52:03       45 阅读