接下來一年裏,打算好好刷一下leetcode題,所以會有個完整的記錄~
順便在刷題時,也會記錄下一些數據結構的用法~
1、兩數之和:(題目來源:LeetCode,地址是: https://leetcode-cn.com/problems/two-sum/)
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
2、先看一下官方解法吧,然後是我自己的解法(很蠢,純粹記錄一下):
(1)官方的很好懂:地址是:
https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/
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++) {
int left = target - nums[i];
if(map.containsKey(left)){
return new int[]{map.get(left),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum value");
}
}
(2)然後看評論說是java第一的解法,具體解釋自己上leetcode看吧~
class Solution {
public int[] twoSum(int[] nums, int target) {
int indexArrayMax = 2047;
int[] indexArrays = new int[indexArrayMax + 1];
for (int i = 0; i < nums.length; i++) {
int diff = target - nums[i];
int index = diff & indexArrayMax;
if (indexArrays[index] != 0) {
return new int[] { indexArrays[index] - 1, i };
}
indexArrays[nums[i] & indexArrayMax] = i + 1;
}
throw new IllegalArgumentException("No two sum value");
}
}
3、談下我做題時出現的問題(運行時都通過,但是提交時失敗,正式提交的測試用例情況比較多)
(剛開始做leetcode,比較蠢,大佬們忽略,我就記錄下)
(1)剛開始直接從數組兩端指針往中間移,想着nums[i]+nums[j]看和是大了還是小了就往左還是右移-----但是數組沒排序
(2)第二次傻逼的直接用Arrays.sort(nums)排序了,但是數組下標就亂了。
(3)第三次用map(nums[p],p)這樣建了個map存放原始數據,然後數組再排序,這麼放是想直接map.get(nums[i])就獲得下標了---但是問題是,nums[p]可能有重複值。
(4)然後就老老實實寫了個原始的,很蠢,代碼如下:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int p=0;p<nums.length;p++){
map.put(p,nums[p]);
}
Arrays.sort(nums);
int i=0;
int j=nums.length-1;
for(int p=0;p<nums.length;p++){
if(nums[i]+nums[j]==target){
//直接返回
break;
}else if(nums[i]+nums[j]>target){
j=j-1;
continue;
}else{
i=i+1;
continue;
}
}
int m=0;int n=0;
for(Integer getKey:map.keySet()){
if(map.get(getKey).equals(nums[i])){
m=getKey;
map.remove(getKey);
break;
}
}
for(Integer getKey:map.keySet()){
if(map.get(getKey).equals(nums[j])){
n=getKey;
break;
}
}
int[] result={m,n};
return result;
}
}
很蠢的通過了。。。。。