找了一段时间的实习,总结一下LeetCode上面试出现频率比较高的题,只总结一部分,后续还会继续更新。
一、Two Sum
题意是给出一个数组,输出和为k的两个数。数组为无序的。
这道题的解题思路是先把数组排序,再用两个指针,分别指向头和尾,并算出头和尾的和s,再把s与k比较,如果s小于k,头指针往后移,如果s大小k,尾指针往前移。直到找到为止。如果头尾指针相遇还没找到,则证明不存在。
代码如下:
public class Main {
public static void main(String[] args){
int[] a = {
1,3,2,1,4,5};
printK(a,5);
}
public static void printK(int[] array,int k){
if(array == null||array.length<=0){
return ;
}
int length = array.length;
Arrays.sort(array);
int start = 0;
int end = length - 1;
while(start < end){
while(array[start] == array[start+1]){
start++;
}
while(array[end] == array[end-1]){
end--;
}
if(array[start] + array[end] == k){
System.out.println(start+" "+end);
start ++;
}
if(array[start]+array[end] < k){
start++;
}
if(array[start]+array[end] > k){
end--;
}
}
//System.out.println("can't find");
}
}
二,3Sum
题意:从给定的数组中找三个数,让它们的和为0。输出所有可能。
如[1,3,-1,0,-3],那么输出[1,-1,0],[3,0,-3]。
思路:这个其实是以第一个题目为基础,首先进行排序。然后从数组第一位开始遍历,如第一位为1,在剩余后面的数组[3,-1,0,-3]中找出和为-1的两个数。用的就是第一题的思路。
代码:
public class Main {
public static void main(String[] args){
int[] array = {-1, 0,1,2,-1,-4};
print3Num(array, 0);
}
public static void print3Num(int[] array,int k){
Arrays.sort(array);
int length = array.length;
if(array == null||array.length<=0){
return ;
}
for(int i = 0;i < length;i++){
if(i<length-1&&array[i] == array[i+1]){
continue;
}
int num = k-array[i];
printK(array,i,length-1,array[i],num);
}
}
public static void printK(int[] array,int start,int end, int num,int k){
while(start < end){
while(array[start] == array[start+1]){
start++;
}
while(array[end] == array[end-1]){
end--;
}
if(ar