这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
1975. 最大方阵和
思路分析
这道题我看个图和题目名称就有种强烈的前缀和的既视感,但是仔细看下好像并不是,首先目的是求方阵元素的最大和,同时我们又可以无限次的对公共边进行乘以-1操作,对于两个正数,-1操作肯定是亏的,对于两个负数,-1操作会将其转为两个正数,对于一正一负的情况,-1操作会互换-1的位置。
因此我们大胆猜测,如果题目中有偶数个-1,那么最大和为abs(arr[i])的和,如果有奇数个-1,那么最大和为abs(arr[i])的和减去abs(arr[i])最小值*2
long long maxMatrixSum(vector<vector<int>>& matrix) {
int numfushu = 0;
long long ret = 0;
int mi = 100000;
for(int i = 0; i < matrix.size(); i++){
for(int j = 0; j < matrix[i].size(); j++){
if(matrix[i][j] < 0 ){
numfushu++;
}
int ab = abs(matrix[i][j]);
ret += ab;
mi = min(ab, mi);
}
}
if (numfushu % 2 == 0)return ret;
return ret - mi * 2;
}
答案果然是这么回事,完全不能理解为啥非要用longlong卡一下。
12. 整数转罗马数字
思路分析
这道题对于普通用例来说,比如27,其实就是一道不断的判断数字大小并除法再取余数,比如27就是小于50大于10,27 / 10 = 2 27 % 10 = 7, 7 小于10大于5 7 / 5 = 1 7 % 5 = 2。
需要关注的仅仅是对特例的处理。
答案使用硬编码的思路另辟奇径的解决了这个问题(作者在看到答案后将自己的垃圾代码删掉了)
const string thousands[] = {"", "M", "MM", "MMM"};
const string hundreds[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const string tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const string ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
class Solution {
public:
string intToRoman(int num) {
return thousands[num / 1000] + hundreds[num % 1000 / 100] + tens[num % 100 / 10] + ones[num % 10];
}
};