⭐️前面的话⭐️
大家好!本篇文章将介绍的剑指offerOJ题,来自力扣[剑指 Offer 57. 和为s的两个数字],本文将以这道题为背景,介绍经典的双“指针”,此“指针”非彼指针,其实叫左右索引更好一点,不要和C中的指针混起来,双指针只是一种做题技巧,但是大家都这么叫的啊,展示代码语言暂时为:Java,C/C++。
博客主页:未见花闻的博客主页
欢迎关注点赞收藏⭐️留言
本文由未见花闻原创,CSDN首发!
首发时间:2021年12月30日
✉️坚持和努力一定能换来诗与远方!
刷题推荐书籍:《剑指offer专项版》,《剑指offer第2版》
参考在线编程网站:牛客网力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
导航小助手
- ⭐️剑指 Offer 57. 和为s的两个数字⭐️
- 题目详情
- 解题思路
- 源代码
- 总结
⭐️剑指 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]
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. 移动零
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)