【LeetCode刷题】1. 两数之和
题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
两种解法:
暴力法:两次遍历
空间复杂度:O(1)
时间复杂度:O(n^2)
public int[] TwoSum(int[] nums, int target) { int[] newNums ; for(int i = 0;i<nums.Length;i++) { for(int j = 0;j<nums.Length;j++) { if(i==j) continue; if(nums[i]+nums[j]==target) { newNums = new[] {i,j}; return newNums; } } } return null; // int[] newNums ; // for(int i = 0;i<nums.Length;i++) // { // for(int j = 1;j<nums.Length;j++) // { // if(nums[i]+nums[j]==target) // { // newNums = new[] {i,j}; // return newNums; // } // } // } // return null; }
哈希法:字典解法(Hash表)
空间复杂度:O(n)
时间复杂度:O(n)
public class Solution { public int[] TwoSum(int[] nums, int target) { int[] newNums = new int []{0,0}; Dictionary<int,int> dict = new Dictionary<int,int>(); for(int i = 0;i<nums.Length;i++) { int result = target - nums[i]; if(dict.ContainsKey(result)&& dict[result] != i) { newNums[0] = i; newNums[1] = dict[result]; return newNums; } if(!dict.ContainsKey(nums[i])) { dict.Add(nums[i],i); } } return newNums; } }