- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
题目地址:https://leetcode.com/problems/two-sum/#/descriptionopen in new window
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
Youmay assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
找出两个索引,这两个索引对应的数组的数字之和等于target.
第一次遍历保存每个数字和索引的对应关系,第二次遍历nums找到target - num是不是在字典中,如果在的话还要保证同样的数字不能用两次。需要注意的是,如果有相同的数字在nums中出现,那么字典中只会保存后面的那个数字的位置,因此第二次遍历的时候一定只能从左到右的走。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = {}
for i, num in enumerate(nums):
dic[num] = i
for i, num in enumerate(nums):
if target - num in dic and dic[target - num] != i:
return [i, dic[target - num]]
1 2 3 4 5 6 7 8 9 10 11 12 13
这个遍历的方法其实就是只保存已经出现了的数字的方式。当遍历的过程中发现了目标在已经遍历过的字典中出现了,那么就停止,这样的题实在是太多了。
这个题首先想到的是时间复杂度O(n^2)的遍历,但是肯定会超时,所以想到用HashMap保存已经有的数据出现的位置,这样可以使如果要求的数字出现的时候不再继续遍历,及时停止即可。有个技巧就是判断差是否在HashMap中,而不是遍历一遍HashMap来求和。
public class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i = 0; i < nums.length; i++){
if(map.containsKey(target - nums[i])){
return new int[]{map.get(target - nums[i]), i};
}else{
map.put(nums[i], i);
}
}
return new int[2];
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13
python解法如下,打败100%的提交。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
N = len(nums)
pos = dict()
for i, num in enumerate(nums):
if target - num in pos:
return [pos[target - num], i]
else:
pos[num] = i
return [0, 0]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
另外有一个种解法是双指针解法,对nums进行排序,然后使用双指针分别从左边和右边向中间走,如果两者的和相加是target说明已经找到。再返回其在数组中的位置。
C++代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> copy = nums;
sort(nums.begin(), nums.end());
int left = 0;
int right = nums.size() - 1;
while (left != right) {
if (nums[left] + nums[right] == target)
break;
else if (nums[left] + nums[right] > target)
right --;
else
left ++;
}
vector<int> res(2, -1);
for (int i = 0; i < copy.size(); ++i) {
if (copy[i] == nums[left] && res[0] == -1) {
res[0] = i;
} else if (copy[i] == nums[right]) {
res[1] = i;
}
}
return res;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
Sorry, the original image cannot be uploaded due to some security reasons. The following is a sch
如何使用 thymeleaf th:each 同时迭代两个列表。 room name 这是有效的,但我想做这样的事情
我有两个表存储成员数据 成员:id、field1、field2 和 field3... members_extra:memberId、someExtraField1 和 someExtraField2
我在 R 中有一个数据框,如下所示: Word Base Number Type - - - - shoe shoe 4834 si
我在 R 中有一个数据框,如下所示: Word Base Number Type - - - - shoe shoe 4834 si
我的场景是一个用户表和一个图片表。每个用户可以上传多张图片。每个用户都可以将自己的一张图片设置为自己最喜欢的图片,但这并不影响该图片位于该用户的图片集中。 事实证明,将其映射到 hibernate 是
最近,我一直在探索Python中的异或密码。我有两种“工作”方法: def XORcipher(plaintext, key): output = "" for character i
我对我用 C 编写的程序有疑问。我将在两列中并排写两个不同的字符串。我没有找到我的问题的明确答案,因为他们几乎总是给出长度或数量已知的数字示例。 我有两个字符串,最大长度为 1500 个字符,但对我来
我在 iPhone 应用程序中使用 CGContext 时遇到一些问题。我试图用不同的颜色绘制几条线,但所有线最终总是具有最后使用的颜色。我尝试了几种方法,但并不幸运。 我建立了一个小型示例项目来处理
我最近刚刚拿起 KO,想做类似以下的事情。 有两个输入,它们会互相改变。 HTML: 脚本: function DataViewModel() { var self = this;
我有一个 Excel Power Query,它可以从本质上是一个时间表 Web 应用程序导入并转换 CSV 数据传输文件,以便再次通过 CSV 导入到我们的薪资应用程序中。某些行在两个单独的字段中同
这个问题已经有答案了: Calculating the difference between two Java date instances (46 个回答) 已关闭 6 年前。 我想检查我的用户登录
这是一个新手问题。我有两个 javascript 和一个 html 文件。当我点击一个图像时,它会转到第一个 .js 文件,当它最终运行所有代码时,它应该转到第二个 .js 文件。但是如何连接不同文件
我有两个模型:Saft(杂志)和 Keyword。每个“Saft”都由一系列关键字定义,但也有一个标题,该标题始终是其关键字之一。 Saft 和关键字模型通过 HABTM 连接表连接,以便提取所有关键
我有以下模型: class AcademicRecord(models.Model): record_id = models.PositiveIntegerField(unique=True,
我想画一条穿过圆但被圆边界剪切的线。这是到目前为止我的代码, var elem = document.getElementById('draw-shapes'); var params = { wid
我正在研究 NodeJs,我的问题是: 进程A在计算机A上运行,进程B在计算机B上运行,现在我想向它们广播一条消息,我该如何实现? 最佳答案 您应该查看消息队列。 Redis具有发布/订阅功能,是常见
我想两两比较表中的行,只保留相似的匹配项。 import pandas as pd df = pd.DataFrame.from_items([('a', [0,1,1,0]), ('b', [0,0
正如标题所解释的,假设我有两个 ActiveRecord::Base 模型:SatStudentAnswer 和 ActStudentAnswer。 我有一个学生模型 has_many :act_st
假设我有两个列表:a=[1,2,3]b=[4,5,6]我想将它们写入一个文本文件,以便获得一个两列文本文件: 1 4 2 5 3 6 最佳答案 只需 zip 列表,并将它们写入 csv 文件,并以制表
我是一名优秀的程序员,十分优秀!