https://leetcode.com/problems/two-sum/
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may 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].
public class Solution {
public int[] TwoSum(int[] nums, int target) {
Dictionary<int, int> temp = new Dictionary<int, int>();
for (int i = 0; i < nums.Length; i++)
{
int left = target - nums[i];
if (temp.ContainsKey(left))
{
return new int[] { temp[left], i };
}
if (!temp.ContainsKey(nums[i]))
{
temp.Add(nums[i], i);
}
}
return null;
}
}
Runtime: 264 ms, faster than 81.11%
of C# online submissions for Two Sum.
Memory Usage: 29.2 MB, less than 51.69%
of C# online submissions for Two Sum.
Time Complexity: O(n)
Space Complextiy: O(n)
本來一開始我是使用暴力法──用兩個for迴圈去解決,但是這樣發現是O(n^2)
後,就試圖用更好的方式去寫。
left(餘數)
有
,則回傳 Dictionary 的餘數 array 裡的 index 及現在的 index
沒有
,則記錄此次 餘數
及 index
到 Dictionary 裡這樣我就可以用一個 for 迴圈邊算每個 nums 的餘數、邊找有沒有符合的答案。
以上就是這次 LeetCode 刷題的分享啦!
如果其它人有更棒的想法及意見,請留言或寄信(t4730@yahoo.com.tw) 給我。
那我們就下回見囉
先存到 map 用 map 的 hashcode 的原因去找值,會比這快多。
初學者剛練習了一題而已,互相學習 :)
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i<nums.length; i++)
map.put(nums[i], i);
for (int i=0; i<nums.length; i++) {
int diff = target - nums[i];
if (map.containsKey(diff) && map.get(diff) != i)
return new int[] {i, map.get(diff)};
}
throw new RuntimeException("no matched nums");
我也不是非常非常理解所有的物件形態,感謝你的分享~保持交流~~
https://www.books.com.tw/products/0010771263 好像是這本吧,有講到 array 是依序找的,但 hashmap 是直接 hash 出值再 mode 找到位置,快速非常多,可以參考看看,該書圖解的蠻清楚的
我發現可以少寫一行判斷,Dictionary可以直接宣告Key的值
若有重複的Key,不會報錯,會直接覆蓋上去,只是會更改到結果
變成重複的值會取最後一個重複的Index
但還是會過關,這題剛好沒有Target取到重複值Index的TestCase
不過他題目也沒有說明重複值要取第一個還是最後一個,就無所謂了
public int[] TwoSum(int[] nums, int target)
{
Dictionary<int, int> temp = new Dictionary<int, int>();
for (int i = 0; i < nums.Length; i++)
{
int number = target - nums[i];
if (temp.ContainsKey(number))
return new int[] { temp[number], i };
temp[nums[i]] = i;
}
throw new ArgumentNullException();
}