1913. 两个数对之间的最大乘积差
题目
思路分析
力扣第一题永远是一边循环题么。。。
注意本题对于用例的限制
提示:
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. 循环轮转矩阵
题目
返回执行 k 次循环轮转操作后的矩阵。
思路分析
这道题其实也没什么难点,就是纯纯的模拟,这种题就是设计好几个模拟的“工具”,以及一个需要推导的公式就可以了。
-
首先逆时针旋转共有四种状态:[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个元素,并不断更新数组,得到答案