力扣竞赛247期(上)| 8月更文挑战

557 阅读2分钟

1913. 两个数对之间的最大乘积差

题目

截屏2021-08-01 下午4.51.01.png

思路分析

力扣第一题永远是一边循环题么。。。

注意本题对于用例的限制

提示:

  • 4 <= nums.length <= 10^4^
  • 1 <= nums[i] <= 10^4^

通过以上限制,我们设置初始值max1,max2,min1,min2为

int max1 = 0, max2 = 0;
int min1 = 10004, min2 = 10004;

这里说明一下,自然可以通过排序然后解题,代码也更加的易懂,但是时间复杂度会差一些。

代码

    int maxProductDifference(vector<int>& nums) {
        int max1 = 0, max2 = 0;
        int min1 = 10004, min2 = 10004;
        for(int i = 0; i < nums.size(); i++){
            if(nums[i] > max2){
                max2 = nums[i];
                if(max1 < max2){
                    swap(max1,max2);
                }
            }
            if(nums[i] < min2){
                min2 = nums[i];
                if (min1 > min2){
                    swap(min1, min2);
                }
            }
        }
        return (max1 * max2) - (min1 * min2);
    }

1914. 循环轮转矩阵

题目

截屏2021-08-01 下午5.22.47.png

返回执行 k 次循环轮转操作后的矩阵。

截屏2021-08-01 下午5.28.51.png

思路分析

这道题其实也没什么难点,就是纯纯的模拟,这种题就是设计好几个模拟的“工具”,以及一个需要推导的公式就可以了。

  • 首先逆时针旋转共有四种状态:[0, 1], [1, 0], [0, -1], [-1. 0]每次到达临界点时更改一次状态。

    • 临界点的计算方式如下: 对于第i层,每行共有m - 2 * (i - 1) 个元素,每列一共有 n - 2 * (i - 1)个元素【需要注意这种计算方式对于边角是有一次重复的】,因此可以修正为我们的tmp指针横向移动m - 2 * (i - 1) - 1次时,修改一次状态,纵向移动n - 2 * (i - 1) - 1次时,修改一次状态。
  • 其次,对于逆时针旋转k次这点,并没有必要真的旋转k次,我们仅仅需要计算k次的偏移量即可,偏移量计算公式为:对于第i层,每层元素为 2 *(m - 2 * (i - 1) - 1 + n - 2 * (i - 1) - 1)个【当然可以化简,这么写是为了方便和之前的数据对照,后文将这个数字设置为LenI】。偏移量为 k % LenI。

  • 最后,我们可以设置一个长度为k+1 的数组(一个存放临时值用于交换),逐圈遍历LenI+k % LenI个元素,并不断更新数组,得到答案