室友征服了跷跷板后,掌握了双指针

室友征服了跷跷板后,掌握了双指针,第1张

室友征服了跷跷板后,掌握了双指针

⭐️前面的话⭐️

大家好!本篇文章将介绍的剑指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]
来源:力扣(LeetCode)链接:剑指 Offer 55 - II. 平衡二叉树 解题思路

预备知识:
所谓的“双指针”,其实就是利用两个数组索引界根据一定的的条件来解决问题,不要把它和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] 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. 移动零


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685900.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存