题目描述:求一个有序数组(假设升序)中两个元素值相加为k的数组,返回这两个元素的下标。没找到返回 -1。
Java实现:查看完整测试代码
方法1:设置两个循环遍历数组,依次相加比较。时间复杂度O(n^2),空间复杂度O(n)。
public static int[] sumK(int[] a,int k){
int[] index = {-1,-1};
int i = 0;
int j = 0;
for(i = 0;i < a.length - 1;i++){
for(j = i + 1;j < a.length;j++ ){
if(a[i] + a[j] == k){
index[0] = i;
index[1] = j;
}
}
}
return index;
}
方法2:设置两个指针 x,y,依次指向数组第一个元素和最后一个元素,两者相加结果与 k 进行比较,若
- 等于 k ,返回此时元素下标
- 小于 k,x++
- 大于 k,y--
若 x == y 时 x + y != k,则说明数组中不存在两个值相加为 k。返回 -1,-1。时间复杂度O(n),空间复杂度O(n)
public static int[] sumK2(int[] a,int k){
int x = 0;
int y = a.length - 1;
int[] result = {-1,-1};
while(x < y){
if(a[x] + a[y] == k){
result[0] = x;
result[1] = y;
return result;
}else if(a[x] + a[y] > k){
y--;
}else{
x++;
}
}
return result;
}
C语言实现:查看完整测试代码 时间复杂度O(n),空间复杂度O(1)。
由于空间复杂度为O(1),那么就不能定义新的数组存储下标,定义结构体。
typedef struct index{
int x;
int y;
}A;
A arrIndex;
void sumK(int a[], int len, int k){
int left = 0;
int right = len - 1;
while (left < right){
if (a[left] + a[right] < k){
left++;
}
else if (a[left] + a[right] > k){
right--;
}
else{
arrIndex.x = left;
arrIndex.y = right;
break;
}
}
}