🥚今日鸡汤🥚
修仙之道,需有勇气和决心,方能战胜一切困难。
——《斗破苍穹》
目录
1.题目一
给你一个长度为
n
的整数数组nums
和 一个目标值target
。请你从nums
中选出三个整数,使它们的和与target
最接近。返回这三个数的和。
假定每组输入只存在恰好一个解。
2.思路分析
- 1.为了后序避免重复,先从小到大排序
- 2.假设前三个数之和s,即为答案之解
- 3.先固定一个值,在使用双指针排查
- 4.计算三数之和sum,让s与sum比较与目标值之间的距离
- 5.如果sum<target,L++;
- 6.如果sum>target,R--;
3.代码实现
public int getSum(int[] array, int target) {
Arrays.sort(array);//从小到大排序
int s = array[0] + array[1] + array[2];//假设s即为答案的解
for (int i = 0; i < array.length; i++) {//先固定一个值
int L = i + 1, R = array.length - 1;//定义左右指针
while (L < R) {
int sum = array[i] + array[L] + array[R];
if (Math.abs(target - sum) < Math.abs(target - s)) {//与目标值之间的距离
s = sum;
} else if (sum < target) {
L++;
} else if (sum > target) {
R--;
} else {
return s;
}
}
}
return s;
}
4.题目二
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。
5.思路分析
- 1.将重复的元素移到右边
- 2.使用双指针L,R,一前一后
- 3.当arr[L]!=arr[R],将arr[L+1]=arr[R],并将L指针和R指针同时后移
- 4.当arr[L]==arr[R],只需要将R指针后移即可
6.代码实现
public int getArr(int[] array) {
if (array == null || array.length == 0) {
return 0;
}
int L = 0, R = 1;
while (R < array.length) {
if (array[L] != array[R]) {
array[L + 1] = array[R];
L++;
}
R++;
}
return L + 1;
}