【剑指offer】和为定值的两个数

题目描述:

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,输出任意一对即可

输入:

每个测试案例包括两行:
第一个参数包含n个整数数组,每个数组均为NSNumber类型。数组的长度限制在 1M 以内。
第二个参数包含一个整数value,value表示两数之和。

输出:

对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”

思想:

类似快速排序,将两边不合理的值去掉,然后查找中间的,先查找右边,再查找左边
代码:

+ (BOOL)equalSubWithArray:(NSArray *)array value:(NSInteger )value {
    if (array == nil || array.count == 0) {
        return false;
    }
    NSInteger left = 0;
    NSInteger right = array.count - 1;
    NSNumber *tempRightNumber = array[right];//取出数组最右侧的值
    NSInteger tempRightValue = tempRightNumber.integerValue;
    while (tempRightValue > value) {//待比较值与最右侧值做比较,一直找到比待比较值小的数,这样会比较节约时间
        --right;
        tempRightNumber = array[right];
        tempRightValue = tempRightNumber.integerValue;
    }
    NSNumber *tempLeftNumber = array[left];
    NSInteger tempLeftValue = tempLeftNumber.integerValue;
    while (tempLeftValue + tempRightValue < value) {//去掉最小的不可能用到的数据
        ++left;
        tempLeftNumber = array[left];
        tempLeftValue = tempLeftNumber.integerValue;
    }
    while (left < right) {
        if (tempLeftValue + tempRightValue == value) {//如果想等自然最好,打印两个值
            NSLog(@"最小的值为%zu, 最大的值为%zu",tempLeftValue, tempRightValue);
            return true;
        } else if (tempLeftValue + tempRightValue > value) {//玩大了那右边指针前移
            --right;
        } else {
            ++left;//玩小了左边指针后移
        }
    }
    
    return false;
}

GitHub : https://github.com/XiaoChenYung/ArrowToOffer/blob/master/ArrowToOffer/EqualSum.m

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,637评论 25 708
  • 友情,亲情,爱情,生命真的无价么?不知道如何回答的时候,试着看看下面的几个问题。 有多少朋友是因为金钱的关系闹掰的...
    haolujun阅读 713评论 2 2
  • 游戏背景: 2013年腾讯游戏和集英社达成大规模版权合作,获得了《火影忍者》等11部经典漫画的电子版发行权。我们眼...
    慕轩宇韩阅读 6,805评论 5 4