算法专练 01 :数组

1.2016. 增量元素之间的最大差值

原题链接
          给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。
          返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。
示例 1:
输入:nums = [7,1,5,4]
输出:4
解释:
最大差值出现在 i = 1 且 j = 2 时,nums[j] - nums[i] = 5 - 1 = 4 。
注意,尽管 i = 1 且 j = 0 时 ,nums[j] - nums[i] = 7 - 1 = 6 > 4 ,但 i > j 不满足题面要求,所以 6 不是有效的答案。
示例 2:
输入:nums = [9,4,3,2]
输出:-1
解释:
不存在同时满足 i < j 和 nums[i] < nums[j] 这两个条件的 i, j 组合。
示例 3:
输入:nums = [1,5,2,10]
输出:9
解释:
最大差值出现在 i = 0 且 j = 3 时,nums[j] - nums[i] = 10 - 1 = 9
提示:
n == nums.length
2 <= n <= 1000
1 <= nums[i] <= 10^9
          这道题没什么好说的,我们在模拟的过程中维护好数组中的最小值,然后不断更新ans即可。
          需要注意的是,这种做法如果没有找到合法的ans,最后ans会变为0,这个时候就要返回-1.

class Solution {
public:
    int maximumDifference(vector<int>& nums) {
        int n=nums.size();
        int minv=nums[0];
        int ans=-1;
        for(int i=0;i<n;++i){
            minv=min(minv,nums[i]);
            ans=max(nums[i]-minv,ans);
        }
        return ans==0?-1:ans;
    }
};

2.2239. 找到最接近 0 的数字

原题链接

          给你一个长度为 n 的整数数组 nums ,请你返回 nums 中最 接近 0 的数字。如果有多个答案,请你返回它们中的 最大值 。
示例 1:
输入:nums = [-4,-2,1,4,8]
输出:1
解释:
-4 到 0 的距离为 |-4| = 4 。
-2 到 0 的距离为 |-2| = 2 。
1 到 0 的距离为 |1| = 1 。
4 到 0 的距离为 |4| = 4 。
8 到 0 的距离为 |8| = 8 。
所以,数组中距离 0 最近的数字为 1 。
示例 2:
输入:nums = [2,-1,1]
输出:1
解释:1 和 -1 都是距离 0 最近的数字,所以返回较大值 1 。

          和上一道题类似,在模拟的过程中维护好该数到0的距离也就是 a b s ( i ) abs(i) abs(i)的最小值,如果当前的最小值小于之前的距离更新 d i s t dist dist a n s ans ans,如果距离跟之前相等,我们选择较大的元素。

class Solution {
public:
    int findClosestNumber(vector<int>& nums) {
        int ans=INT_MAX;
        int dist=INT_MAX;
        for(auto i:nums){
            int val=abs(i);
            if(val<dist){
                dist=val;
                ans=i;
            }else if(val==dist){
                ans=max(ans,i);
            }
        }
        return ans;
    }
};

3.1475. 商品折扣后的最终价格

原题链接

          给你一个数组 prices ,其中 prices[i] 是商店里第 i 件商品的价格。
商店里正在进行促销活动,如果你要买第 i 件商品,那么你可以得到与 prices[j] 相等的折扣,其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ,如果没有满足条件的 j ,你将没有任何折扣。
请你返回一个数组,数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。
示例 1:
输入:prices = [8,4,6,2,3]
输出:[4,2,4,2,3]
解释:
商品 0 的价格为 price[0]=8 ,你将得到 prices[1]=4 的折扣,所以最终价格为 8 - 4 = 4 。
商品 1 的价格为 price[1]=4 ,你将得到 prices[3]=2 的折扣,所以最终价格为 4 - 2 = 2 。
商品 2 的价格为 price[2]=6 ,你将得到 prices[3]=2 的折扣,所以最终价格为 6 - 2 = 4 。
商品 3 和 4 都没有折扣。
示例 2:
输入:prices = [1,2,3,4,5]
输出:[1,2,3,4,5]
解释:在这个例子中,所有商品都没有折扣。
示例 3:
输入:prices = [10,1,1,6]
输出:[9,0,1,6]
提示:
1 <= prices.length <= 500
1 <= prices[i] <= 10^3

          这道题暴力过就好了,数据量只有1000,O(n^2)完全可以接受。遍历两边数组即可。

class Solution {
public:
    vector<int> finalPrices(vector<int>& prices) {
        vector<int> ans;
        for(int i=0;i<prices.size();++i){
            int flag=true;
            for(int j=i+1;j<prices.size();++j){
                if(prices[j]<=prices[i]){
                    ans.push_back(prices[i]-prices[j]);
                    flag=false;
                    break;
                }
            }
            if(flag){
                ans.push_back(prices[i]);
            }
        }
        return ans;
    }
};

4.2248. 多个数组求交集

原题链接

          给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在 nums 所有数组 中都出现过。
示例 1:
输入:nums = [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]
输出:[3,4]
解释:
nums[0] = [3,1,2,4,5],nums[1] = [1,2,3,4],nums[2] = [3,4,5,6],在 nums 中每个数组中都出现的数字是 3 和 4 ,所以返回 [3,4] 。
示例 2:
输入:nums = [[1,2,3],[4,5,6]]
输出:[]
解释:
不存在同时出现在 nums[0] 和 nums[1] 的整数,所以返回一个空列表 [] 。
提示:
1 <= nums.length <= 1000
1 <= sum(nums[i].length) <= 1000
1 <= nums[i][j] <= 1000
nums[i] 中的所有值 互不相同

          这道题的话由于每个数组的元素均不相同,所以可以用一个 h a s h hash hash数组来对这个元素出现次数加一,最后统计 h a s h hash hash数组中的每个元素看他是否为 N N N,如果是的话就在返回数组中加入他.

class Solution {
public:
    vector<int> intersection(vector<vector<int>>& nums) {
        vector<int> ans;
        int hash[1005];
        memset(hash,0,sizeof(hash));
        int n=nums.size();
        for(int i=0;i<n;++i){
            for(int j=0;j<nums[i].size();++j){
                ++hash[nums[i][j]];
            }
        }
        for(int i=1;i<=1000;++i){
            if(hash[i]==n){
                ans.push_back(i);
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F407是一款高性能、低功耗的微控制器,常用于嵌入式系统的设计与开发。而俄罗斯方块游戏是一种经典的游戏,因其简单的规则和好玩的玩法,备受玩家的喜爱。在这里,我们要结合STM32F407的特性,设计一个能够运行在嵌入式系统上的俄罗斯方块游戏。 首先,我们需要选择合适的显示屏。由于STM32F407支持多种接口和协议,包括SPI、I2C、USART等,各种类型的显示屏都可以被适配和使用。对于俄罗斯方块游戏,我们需要一个较大的、高分辨率的显示屏,以展示方块和游戏界面。我们可以选择一块2.8英寸的TFT LCD屏幕,分辨率为240*320,可以通过SPI接口和STM32F407通信。 其次,我们需要设计游戏逻辑和控制模块。游戏基本规则已经很清楚,主要思考如何对STM32F407进行编程实现。我们可以使用C语言编写程序,通过将各种方块数据存储在数组中,实现方块的下落、旋转、消除、计分等基本功能。同时,我们需要使用STM32F407的GPIO、定时器、中断等外设,控制方块的运动和游戏效果的刷新。当然,也可以借助专业的游戏引擎和开发工具,实现更加强大和复杂的游戏逻辑。 最后,我们可以添加声音和音效模块,为游戏增加更多的趣味性和游戏性。STM32F407支持DAC、I2S等音频输出,可以连接外置音频设备,播放声音和音效。我们可以选择一些经典的音乐和音效素材,以及自己设计的音效,为游戏增添动感和情趣。 基于以上的设计思路和方法,我们可以成功地实现一个基于STM32F407的俄罗斯方块游戏。这个游戏除了展示STM32F407的强大性能和多样化功能外,更重要的是能够带给玩家很好的游戏体验和娱乐感。在今后的嵌入式开发中,我们可以根据实际需求,设计更多趣味性和实用性的游戏和软件。 ### 回答2: 俄罗斯方块是一种非常经典的游戏,也是很多程序员在学习嵌入式开发时的练手项目。我们可以基于stm32f407这个单片机设计一个俄罗斯方块游戏。 首先,我们需要连接一个lcd显示屏,以便在屏幕上显示游戏界面和游戏得分等信息。另外,我们还需要连接几个按键,分别用来控制方块的移动和旋转。 为了实现游戏的运行,需要使用定时器和中断技术来不断更新屏幕上的方块位置和形状,并检测是否碰到其他方块或者到达了边界。当一个方块完全落下时,需要检测是否有满行,如果有,将满行删除,并给玩家加分。 游戏结束的条件是方块已无法再移动或旋转。当满足这个条件时,游戏结束,并在屏幕上显示得分和游戏结束的提示信息。 总之,基于stm32f407设计一个俄罗斯方块游戏需要考虑到硬件连接、屏幕显示、按键输入、定时器和中断技术等方面,需要充分利用单片机的功能和资源,才能实现一个完整的游戏。 ### 回答3: 俄罗斯方块是一款经典的游戏,可以通过stm32f407来实现。该游戏的实现包括硬件组装和软件编程两个方面。 硬件组装方面,需要将stm32f407控制器和显示屏、按键等外设进行连接,确保它们之间的通信正常。可以使用JTAG调试程序接口连接,同时使用串口进行通信。 在软件编程方面,按键扫描需要优先处理,以便获取玩家的游戏操作。然后需要进行游戏界面的绘制和更新,比如绘制方块、旋转等。此外,还需要实现方块下落和消除逻辑,以及计分等游戏规则处理。 实现时可以使用STM32CubeMX软件来进行初始化和配置操作,比如设定定时器和计数器,设置按键输入中断等,以提高硬件效率和节省程序设计时间。 总的来说,基于stm32f407设计俄罗斯方块游戏需要掌握硬件连接和控制技术,同时需要熟练掌握C语言编程和算法处理等软件方面的知识。只有两者协同完成才能实现一个完善的俄罗斯方块游戏程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值