11.盛最多水的容器
- 使用双指针,两者中高度短的进行移动。
- 因为算容器容积,高度是看短的那个,所以移动长的,容积只会更短或不变。只有移动短的,容积才可能变大
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int res = 0;
int temp = 0;
while(left < right) {
if(height[left] < height[right]) {
res = Math.max(res, (right - left) * height[left]);
temp = height[left];
while(left < right && height[left] <= temp) //如果移动后比原来的还短,继续移动
left++;
}else {
res = Math.max(res, (right - left) * height[right]);
temp = height[right];
while(left < right && height[right] <= temp) right--;
}
}
return res;
}
}
12.整数转罗马数字
- 用贪心算法
- 尽可能优先使用较大数值对应的字符,最后转换得到的罗马数字的字符个数更少
class Solution {
public String intToRoman(int num) {
StringBuilder sb = new StringBuilder();
//阿拉伯数字与罗马数字可能出现的所有情况和对应关系,放在两个数组中
String[] chars = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int[] nums = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
int index = 0;
while(index < 13) {
while(num >= nums[index]) { //数字大于当前的数组中的值
sb.append(chars[index]);
num -= nums[index]; //减去当前数组的值
}
index++; //说明此时数字小于当前数组中的值,数组索引可以往后移一位,去判断下个较小的数
}
return sb.toString();
}
}