??前面的话??
大家好!本篇文章将介绍的剑指offerOJ题,来自力扣[剑指 Offer 57. 和为s的两个数字],本文将以这道题为背景,介绍经典的双“指针”,此“指针”非彼指针,其实叫左右索引更好一点,不要和C中的指针混起来,双指针只是一种做题技巧,但是大家都这么叫的啊,展示代码语言暂时为:Java,C/C++。
📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏??留言📝 📌本文由未见花闻原创,CSDN首发! 📆首发时间:🌴2021年12月30日🌴 ??坚持和努力一定能换来诗与远方! 💭刷题推荐书籍:📚《剑指offer专项版》,📚《剑指offer第2版》 💬参考在线编程网站:🌐牛客网🌐力扣 博主的码云gitee,平常博主写的程序代码都在里面。 博主的github,平常博主写的程序代码都在里面。 🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
??剑指 Offer 57. 和为s的两个数字??
🔐题目详情
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
💡解题思路
预备知识: 所谓的“双指针”,其实就是利用两个数组索引界根据一定的的条件来解决问题,不要把它和C语言中的指针混为一谈哦!
解题思路: 由于该题已经为你排好序了,为升序,所以考虑从数组左右边界入手,根据题目条件对数组进行“缩圈”。不妨设数组nums 左索引为left ,右索引为right ,目标数为target :
n
u
m
s
[
l
e
f
t
]
+
n
u
m
s
[
r
i
g
h
t
]
>
t
a
r
g
e
t
nums[left] + nums[right] > target
nums[left]+nums[right]>target,说明两数之和大于目标数,由于数组是升序排列的,所以需要将两数之和减小,即将right 减1 ; 同理
n
u
m
s
[
l
e
f
t
]
+
n
u
m
s
[
r
i
g
h
t
]
<
t
a
r
g
e
t
nums[left] + nums[right] < target
nums[left]+nums[right]<target,left 加1 。
n
u
m
s
[
l
e
f
t
]
+
n
u
m
s
[
r
i
g
h
t
]
=
=
t
a
r
g
e
t
nums[left] + nums[right] == target
nums[left]+nums[right]==target ,将两数存入一个数组返回。
🔑源代码
Java:
class Solution {
public int[] twoSum(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
if (nums[left] + nums[right] > target) {
right--;
}else if (nums[left] + nums[right] < target) {
left++;
}else {
return new int[]{nums[left], nums[right]};
}
}
return null;
}
}
C:
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int* ans = (int*)malloc(sizeof(int) * 2);
int left = 0;
int right = numsSize - 1;
while (left < right)
{
if (nums[left] + nums[right] > target)
{
right--;
}
else if (nums[left] + nums[right] < target)
{
left++;
}
else
{
ans[0] = nums[left];
ans[1] = nums[right];
*returnSize = 2;
return ans;
}
}
*returnSize = 0;
return NULL;
}
🌱总结
由于该题已经为你排好序了,为升序,所以考虑从数组左右边界入手,根据题目条件对数组进行“缩圈”。 类似题如下: 189. 轮转数组 202. 快乐数 283. 移动零
觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!
|