第十一周:
题解:
leetcode:4
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//我们规定第一个数组的长度较小!
if(nums1.length>nums2.length){
return findMedianSortedArrays(nums2,nums1);
}
int m=nums1.length,n=nums2.length;
int midres1=0,midres2=0;
//本质就是对nums1中的索引进行二分
int left=0,right=nums1.length;
while(left<right){
int mid=(left+right)/2;
int mid_j=(m+n+1)/2-mid;//nums2数组中对应的索引
int max1=(mid==0?Integer.MIN_VALUE:nums1[mid-1]);
int min1=(mid==m?Integer.MAX_VALUE:nums1[mid]);
int max2=(mid==0?Integer.MIN_VALUE:nums2[mid_j-1]);
int min2=(mid==n?Integer.MAX_VALUE:nums2[mid]);
//判断i
if(max1<=min2){//nums1[mid-1]<=nums2[mid]
midres1=Math.max(max1,max2);
midres2=Math.min(min2,min1);
left=mid+1;
}else{
right=mid-1;
}
}
return (m+n)%2==0?(midres1+midres2)/2.0:midres1;
}
leetcode:20
public boolean isValid(String s) {
Stack<Character>stack = new Stack<Character>();
for(char c: s.toCharArray()){//遍历S,遇到左边的就压入对应的,遇到右边的就弹出!
if(c=='(')stack.push(')');
else if(c=='[')stack.push(']');
else if(c=='{')stack.push('}');
else if(stack.isEmpty()||c!=stack.pop())return false;
}
return stack.isEmpty();
}
leetcode:71
public static String simplifyPath(String path) {
String[] str=path.split("/");
Stack<String> stack=new Stack();
for (int i = 1; i < str.length; i++) {//注意要从1开始
if(str[i].equals("..")){//返回上一级
if(!stack.isEmpty())//且不为空
stack.pop();//删除最后一个
else continue;
}else if(!str[i].equals(".")&&!str[i].equals("")){
stack.add('/'+str[i]);
}
}
StringBuffer res=new StringBuffer();//比sbuilder快一点
int size=stack.size();
for (int i = 0; i < size; i++) {
res.append(stack.get(i));
}
return size==0?"/":res.toString();
}
知识:《疯狂的java讲义》看到P200了,然后下周得开始复习没听课的课了!