LeetCode—11(盛最多水的容器)
方法一:暴力法
简单的考虑每对可能出现的线段组合并找出这些情况之下的最大面积。
时间:
O
(
n
2
)
O(n^2)
O(n2) 空间:
O
(
1
)
O(1)
O(1)
方法二:定义i和j两个指针分别指向数组的左右两端,然后两个指针向中间搜索。每移动一次算一个值和结果比较取较大的,容器装水量的算法是找出左右两个边缘中较小的那个乘以两边缘的距离。
移动的解释:在最外围时得到目前面积,现在为了使面积最大化,考虑更长的两条线段之间的区域。因此试图将指向较长的线段的指针向内侧移动,则矩形面积才会有可能最大。
C++解法:
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0, i = 0, j = height.size() - 1;
while (i < j) {
res = max(res, min(height[i], height[j]) * (j - i));
height[i] < height[j] ? ++i : --j;
}
return res;
}
};
LeetCode—12(整数转罗马数字)
方法一:利用取商法分别提取各个位上的数字,然后分别表示出来。在进行分类分成四类,
1-3,4,5-8,9
代码如下:
class Solution {
public:
string intToRoman(int num) {
string res = "";
vector<char> roman{'M', 'D', 'C', 'L', 'X', 'V', 'I'};
vector<int> value{1000, 500, 100, 50, 10, 5, 1};
for (int n = 0; n < 7; n += 2) {
int x = num / value[n];
if (x < 4) {
for (int i = 1; i <= x; ++i) res += roman[n];
} else if (x == 4) {
res = res + roman[n] + roman[n - 1];
} else if (x > 4 && x < 9) {
res += roman[n - 1];
for (int i = 6; i <= x; ++i) res += roman[n];
} else if (x == 9) {
res = res + roman[n] + roman[n - 2];
}
num %= value[n];
}
return res;
}
};
方法二:本体由于限制了输入数字范围这一特性,故而还有贪婪算法的解法,建立一个数表,每次通过查表找出当前最大的数,减去再继续查表。
代码:
class Solution {
public:
string intToRoman(int num) {
string res = "";
vector<int> val{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector<string> str{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
for (int i = 0; i < val.size(); ++i) {
while (num >= val[i]) {
num -= val[i];
res += str[i];
}
}
return res;
}
};
LeetCode—13(罗马数字转整数)
方法:得到对应罗马数字表,利用HashMap数据结构,将罗马字母转化为相应的整数值,因为输入的一定是罗马数字(本题不需要判断是否为罗马数字),那么考虑情况:
1.判断当前数字是否为最后一个数字,或是否后面的数字小于等于它,若是加上当前数字。
2.其他情况减去这个数字。
class Solution {
public:
int romanToInt(string s) {
int res = 0;
unordered_map<char, int> m{{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
for (int i = 0; i < s.size(); ++i) {
int val = m[s[i]];
if (i == s.size() - 1 || m[s[i+1]] <= m[s[i]]) res += val;
else res -= val;
}
return res;
}
};
LeetCode—14(最长公共前缀)
方法:二分法查找。
代码:C++上面方法没有码出来,下面是另一种方法。
string longestCommonPrefix(vector<string>& strs) {
if (strs.size()==0) return "";
for (int i=0; i<strs[0].length(); i++)
for (int j=0; j<strs.size(); j++)
if ( !(i<strs[j].length() && strs[0][i]==strs[j][i]) )
return strs[0].substr(0, i);
return strs[0];
}
LeetCode—15(三数之和)
C++代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
if (nums.empty() || nums.back() < 0 || nums.front() > 0) return {};
for (int k = 0; k < nums.size(); ++k) {
if (nums[k] > 0) break;
if (k > 0 && nums[k] == nums[k - 1]) continue;
int target = 0 - nums[k];
int i = k + 1, j = nums.size() - 1;
while (i < j) {
if (nums[i] + nums[j] == target) {
res.push_back({nums[k], nums[i], nums[j]});
while (i < j && nums[i] == nums[i + 1]) ++i;
while (i < j && nums[j] == nums[j - 1]) --j;
++i; --j;
} else if (nums[i] + nums[j] < target) ++i;
else --j;
}
}
return res;
}
};