1. 题目

1.1 英文题目

Given an array of integers numbers that is already sorted in non-decreasing order, find two numbers such that they add up to a specific target number.

Return the indices of the two numbers (1-indexed) as an integer array answer of size 2, where 1 <= answer[0] < answer[1] <= numbers.length.

The tests are generated such that there is exactly one solution. You may not use the same element twice.

1.2 中文题目

一个有序数组,找到两个数和等于特定数的位置。

注意:索引从1开始并且数组中的一个元素只能用一次。

1.3输入输出

输入 输出
numbers = [2,7,11,15], target = 9 [1,2]
numbers = [2,3,4], target = 6 [1,3]
numbers = [-1,0], target = -1 [1,2]

1.4 约束条件

  • 2 <= numbers.length <= 3 * 104
  • -1000 <= numbers[i] <= 1000
  • numbers is sorted in non-decreasing order.
  • -1000 <= target <= 1000
  • The tests are generated such that there is exactly one solution.

2. 分析

2.1 暴力求解法

这一题首先可以利用暴力求解法,遍历所有可能的组合,复杂度为O(\(n^{2}\)),代码如下:

class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> result(2);
for (int i = 0; i < numbers.size() - 1; i++)
{
for (int j = i + 1; j < numbers.size(); j++)
{
if (target - numbers[i] == numbers[j])
{
result = { ++i, ++j };
break;
}
}
}
return result;
}
};

这种方法运行效率太低,而且没有利用数组有序的条件

2.2 哈希表法

这种方法是参考leetcode第一题的解法,第一题和该题唯一的差异是第一题数组无序,因此第一题的哈希表法同样适用于本题,但是没有利用到数组有序的条件,非最优,时间复杂度为O(n)。代码如下:

class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
// 哈希表
map<int, int> hashMap;
vector<int> ans;
int temp = 0;
for (int i = 0; i < numbers.size(); i++)
{
temp = target - numbers[i];
if (hashMap.count(temp))
{
ans = { ++hashMap[temp], ++i };
break;
}
hashMap[numbers[i]] = i;
}
return ans;
}
};

2.3 二分法

遍历一个,查找另一个,而数组又是有序的,很容易想到二分法,时间复杂度为O(\(nlogn\))。具体代码如下:

class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
//二分法
vector<int> result;
for (int i = 0; i < numbers.size() - 1; i++)
{
int second = target - numbers[i];
int left = i + 1;
int right = numbers.size() - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (second < numbers[mid])
right = mid - 1;
else if (second > numbers[mid])
left = mid + 1;
else
{
result.push_back(++i);
result.push_back(++mid);
break;
}
if (result.size() == 2)
break;
}
}
return result;
}
};

2.4 头尾指针法

该方法特别秒,利用两个指针分别指向头尾,通过头尾数之和和目标数进行比较,前者大则尾指针左移,前者小则指针右移。充分利用了排好序数组这一特性,时间复杂度为O(n),代码如下:

public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> result;
int head = 0;
int tail = numbers.size() - 1;
while (head < tail)
{
int tempAdd = numbers[head] + numbers[tail];
if (tempAdd < target)
head++;
else if (tempAdd > target)
tail--;
else
{
result = { ++head, ++tail };
break;
}
}
return result;
}
};

参考:https://www.jianshu.com/p/f3a8a247f4c8

Leetcode No.167 Two Sum II - Input array is sorted(c++实现)的更多相关文章

  1. 【LeetCode】167. Two Sum II - Input array is sorted

    Difficulty:easy  More:[目录]LeetCode Java实现 Description Given an array of integers that is already sor ...

  2. 【LeetCode】167. Two Sum II - Input array is sorted 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  3. 167. Two Sum II - Input array is sorted - LeetCode

    Question 167. Two Sum II - Input array is sorted Solution 题目大意:和Two Sum一样,这里给出的数组是有序的 思路:target - nu ...

  4. 29. leetcode 167. Two Sum II - Input array is sorted

    167. Two Sum II - Input array is sorted Given an array of integers that is already sorted in ascendi ...

  5. 167. Two Sum II - Input array is sorted【easy】

    167. Two Sum II - Input array is sorted[easy] Given an array of integers that is already sorted in a ...

  6. 167. Two Sum II - Input array is sorted@python

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  7. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

  8. [LeetCode] 167. Two Sum II - Input array is sorted 两数和 II - 输入是有序的数组

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

  9. LeetCode 167. Two Sum II - Input array is sorted (两数之和之二 - 输入的是有序数组)

    Given an array of integers that is already sorted in ascending order, find two numbers such that the ...

随机推荐

  1. GLSL着色器,来玩

    对实现动画的前端同学们来说,canvas可以说是最自由,最能全面控制的一个动画实现载体.不但能通过javascript控制点.线.面的绘制,使用图片资源填充:还能改变输入参数作出交互动画,完全控制动画 ...

  2. kubectl cmd

    集群资源查看 kubectl get nodes #查看节点状态 kubectl get cs #kubectl检查组件健康状态 kubectl get pods kubectl get all ku ...

  3. 安装tomcat8 env

    目录 1 download package 2 install tomcat 3 Pro config 4. docker image 1 download package wget https:// ...

  4. 利用MathType快速提取论文中的公式

    首先随便打开一个论文,比如下图,我们想提取公式(2.2.7) 第一步:按截图快捷键:Win+Shift+S ,把公式截取下来 第二步:打开大佬开发的网站:https://mathf.itewqq.cn ...

  5. LNMP环境搭建与配置

    lnmp就是 Linux+nginx + mysql + PHP,把Apache替换为Nginx: 这里我用到的Linux环境为为centos,接下来就分步骤来一步步安装及测试. 一.安装php 参考 ...

  6. java并发编程工具类JUC第四篇:LinkedBlockingQueue链表队列

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...

  7. NSight Compute 用户手册(上)

    NSight Compute 用户手册(上) 非交互式配置文件活动 从NVIDIA Nsight Compute启动目标应用程序 启动NVIDIA Nsight Compute时,将出现欢迎页面.单击 ...

  8. Usb-type-C端口实现的挑战与设计方案

    Usb-type-C端口实现的挑战与设计方案 USB Type-C port implementation challenges and design solutions USB from 1.1 t ...

  9. Vue packages version mismatch的解决方法 初来乍到,踩坑日常

    初来乍到,踩坑日常 这个问题也是我也是接受别人项目,出现的问题,在下载好依赖后运行的时候报这样的错误 它上面显示两个版本一个vue的版本,一个vue-template-compiler版本,我这边忘了 ...

  10. SpringBoot系列——admin服务监控

    前言 springboot项目部署起来后,如何实时监控项目的运行状况呢?本文记录使用springboot-admin对服务进行监控. springboot-admin介绍:https://codece ...