当前位置: 首页 > news >正文

剑指Offer系列(java版,详细解析)57.和为s的数字

题目一

题目描述

剑指 Offer 57. 和为s的两个数字

难度简单96收藏分享切换为英文接收动态反馈

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]

示例 2:

输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]

限制:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^6

测试用例

  • 功能测试(数组中存在和为s的两个数;数组中不存在和为s的两个数)
  • 特殊输入测试(表示数组的指针为空指针)

解题思路

充分数组是递增排序的性质

  1. 定义两个指针,一个指向数组的第一个数字,一个指向数组的最后一个数字
  2. 如果两个指针指向的数字加起来等于数字s,则返回结果
  3. 如果两个指针指向的数字加起来大于数字s,则指向数组后面数字的指针左移
  4. 如果两个指针指向的数字加起来小于数字s,则指向数组前面数字的指针右移

时间复杂度为O(n)

自己解题


public class Solution {

    public ArrayList<Integer> findNumbersWithSum(int [] array, int sum) {

        ArrayList<Integer> result = new ArrayList<Integer>();
        // 非法输入
        if (array == null || array.length < 2) {
            return result;
        }

        for (int i = 0; i < array.length; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if (array[i] + array[j] == sum) {
                    result.add(array[i]);
                    result.add(array[j]);
                    return result;
                }
            }
        }
        return result;
    }
}

这是大家都能直接想到的解法。它的问题在于时间复杂度过高。

参考解题

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int i = 0, j = nums.length - 1;
        while(i < j) {
            int s = nums[i] + nums[j];
            if(s < target) i++;
            else if(s > target) j--;
            else return new int[] { nums[i], nums[j] };
        }
        return new int[0];
    }
}

题目二

题目描述

和为s的连续正数序列

输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数),例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所有打印出3个连续序列15、46和7~8

测试用例

  • 功能测试(存在和为s的连续序列,如9、100等;不存在和为s的连续序列,如0,4等)。
  • 边界值测试(连续序列的最小和3)

解题思路

  1. 定义连续正数序列的首尾节点small、big;small初始化为1,big初始化为2
  2. 如果序列和等于s,则将序列输出,并改变big值,进入新一轮的查找
  3. 如果序列和大于s,从序列中去掉最小的值,增大small的值,small的值最多加到s/2
  4. 如果序列和小于s,big加1,然后加入到序列中

自己解题

懵逼态

参考解题

class Solution {
    public int[][] findContinuousSequence(int target) {
        int i = 1, j = 2, s = 3;
        List<int[]> res = new ArrayList<>();
        while(i < j) {
            if(s == target) {
                int[] ans = new int[j - i + 1];
                for(int k = i; k <= j; k++)
                    ans[k - i] = k;
                res.add(ans);
            }
            if(s >= target) {
                s -= i;
                i++;
            } else {
                j++;
                s += j;
            }
        }
        return res.toArray(new int[0][]);
    }
}

题目考点

  • 考察应聘者思考复杂问题的思维能力,找规律。
  • 考察应聘者的知识迁移能力。有点菜。

相关文章:

  • 剑指Offer系列(java版,详细解析)58.翻转字符串
  • 剑指Offer系列(java版,详细解析)59.队列的最大值
  • 剑指Offer系列(java版,详细解析)60.n个骰子的点数
  • 剑指Offer系列(java版,详细解析)61.扑克牌中的顺子
  • 剑指Offer系列(java版,详细解析)62.圆圈中最后剩下的数字
  • 剑指Offer系列(java版,详细解析)63.股票的最大利润
  • 剑指Offer系列(java版,详细解析)64.求1+2+...+n
  • 剑指Offer系列(java版,详细解析)65.不用加减乘除做加法
  • 剑指Offer系列(java版,详细解析)66.构建乘积数组
  • 剑指Offer系列(java版,详细解析)67.把字符串转化成整数
  • 剑指Offer系列(java版,详细解析)68.树中两个节点的最低公共祖先
  • Go语言fmt.Sprintf(格式化输出)
  • Go 面试系列:Go interface中nil的比较问题
  • Go 面试系列: new 和 make有什么不同之处呢?
  • Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?
  • ES6指北【2】—— 箭头函数
  • JavaScript 如何正确处理 Unicode 编码问题!
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JAVA SE 6 GC调优笔记
  • nodejs调试方法
  • node学习系列之简单文件上传
  • python学习笔记 - ThreadLocal
  • spark本地环境的搭建到运行第一个spark程序
  • spring + angular 实现导出excel
  • spring security oauth2 password授权模式
  • vue--为什么data属性必须是一个函数
  • Zsh 开发指南(第十四篇 文件读写)
  • 从零开始在ubuntu上搭建node开发环境
  • 关于使用markdown的方法(引自CSDN教程)
  • 今年的LC3大会没了?
  • 理清楚Vue的结构
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 【干货分享】dos命令大全
  • 数据库巡检项
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #includecmath
  • #每天一道面试题# 什么是MySQL的回表查询
  • (2022 CVPR) Unbiased Teacher v2
  • (C++17) std算法之执行策略 execution
  • (简单) HDU 2612 Find a way,BFS。
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (译)2019年前端性能优化清单 — 下篇
  • (转)ObjectiveC 深浅拷贝学习
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .Net 6.0 处理跨域的方式
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core 6 集成和使用 mongodb
  • .NET MVC第三章、三种传值方式
  • .net2005怎么读string形的xml,不是xml文件。
  • .net6Api后台+uniapp导出Excel
  • .NET成年了,然后呢?
  • .net和php怎么连接,php和apache之间如何连接
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限