11、最大容量问题
暴力解法是双层循环,但是时间复杂度过高 n^2
利用双指针,可以将之间复杂度降为n
即: 头部一个指针,尾部一个指针,比较两个指针处对应值的大小,值更小的一个向中间移动一步
class Solution {
public int maxArea(int[] height) {
int area = 0; // 定义初始面积
int left = 0; //左指针
int right = height.length-1; //右指针
while (left <right){
int area1 = (right- left)*Math.min(height[left],height[right]);
area = Math.max(area,area1);
if (height[left]<height[right]){
left++;
}
else{right--;}
}
return area;
}
}
12、罗马数字转换
主要思想是构建一个字典,将罗马数字与整数对应起来,同时字典中应当将特殊构造方法的数也放进去;
class Solution {
public String intToRoman(int num) {
int[] value = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] reps = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
String result = "";
for(int i =0;i<value.length;i++){
int mi = num/value[i];
if (mi!=0) {
result += reps[i] .repeat(mi); //java中将一个字符串重复n次不能直接乘以n,与python不一样
num -=mi*value[i];} // 将已经转化成罗马数字的部分减去
}
return result;
}
}
13、罗马数字转整数
class Solution {
public int romanToInt(String s) {
HashMap<Character,Integer> hs= new HashMap<>();
hs.put('M',1000);
hs.put('D',500);
hs.put('C',100);
hs.put('L',50);
hs.put('X',10);
hs.put('V',5);
hs.put('I',1);
int n= s.length();
int result =0;
var s1 = s.toCharArray();
for (int i = 0;i<n;i++){
if(i<n-1 && hs.get(s1[i])<hs.get(s1[i+1]) ){
result-=hs.get(s1[i]);
}
else{ result+=hs.get(s1[i]);
}
}
return result;
}}
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length ==0){return "";}
String s =strs[0];
for (String string :strs){
while(!string.startsWith(s)){
//如果全部截断了任然不匹配,就直接退出
if(s.length()==0) return "";
//如果不匹配,就变短后再去匹配,通过while循环实现
s=s.substring(0,s.length()-1);
}
}
return s;
}
}
15、
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
int left ;
int right;
List<List<Integer>> result = new ArrayList<>();
for (int begin=0;begin<nums.length;begin++){
if(nums[begin]>0) return result;
//这个if判断是为了去掉重复的
if(begin > 0 && nums[begin] == nums[begin-1]) continue;
//定义左右两个指针
left =begin+1;
right=nums.length-1;
while(left<right){
int sum =nums[begin]+nums[left]+nums[right];
if(sum ==0){
List<Integer> s1 = new ArrayList<>();
s1.add(nums[begin]);
s1.add(nums[left]);
s1.add(nums[right]);
result.add(s1);
//为了去掉重复的,并进行下一次判断
while(left< right && nums[left+1] == nums[left]) left++;
while (left < right && nums[right-1] == nums[right]) --right;
left++;right--;
}
else if(sum >0) {right--;}
else {left++;}
}
}
return result;
}
}