leetcode第一題:給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標
暴力法:
解析:遍歷每個元素 x,並查詢是否存在乙個值與 target - x相等的目標元素。
**如下:
//暴力匹配
public
int[
]twosum
(int
nums,
int target)
;//返回所求的下標}}
}throw
newruntimeexception
("no two sum solution");
}
雜湊表:
解析:因為題中需要的是陣列中的元素和其索引,為了使它們一一對應,可以採用雜湊表來完成具體步驟是:
1.遍歷陣列 nums,i 為當前下標,每個值都判斷map中是否存在 target-nums[i] 的 key 值;
2.如果存在則找到了兩個值,如果不存在則將當前的 (nums[i],i) 存入 map 中,繼續遍歷直到找到為止;
3.如果最終都沒有結果則丟擲異常。
**如下:
public
int[
]twosum
(int
nums,
int target);}
map.
put(nums[i]
, i);}
throw
newillegalargumentexception
("no two sum solution");
}
詳細的解題過程可以參見:
leetcode第27題:給你乙個陣列 nums 和乙個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後陣列的新長度
拷貝覆蓋
解析:1.主要思路是遍歷陣列nums,每次取出的數字變數為num,同時設定乙個下標ans;
2.在遍歷過程中如果出現數字與需要移除的值不相同時,則進行拷貝覆蓋nums[ans] = num,ans自增1;
3.如果相同的時候,則跳過該數字不進行拷貝覆蓋,最後ans即為新的陣列長度。
**如下:
public
intremoveelement
(int
nums,
int val)
}return ans;
}
詳細的解題過程可以參見:
leetcode第35題:給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。
二分查詢:
1.先設定左側下標 left 和右側下標 right,再計算中間下標 mid;
2.每次根據 nums[mid] 和 target 之間的大小進行判斷,相等則直接返回下標,nums[mid] < target 則 left 右移,nums[mid] > target 則 right 左移;
3.查詢結束如果沒有相等值則返回 left,該值為插入位置。
**如下:
public
intsearchinsert
(int
nums,
int target)
else
}return left;
}
詳細的解題過程可以參見:
還有一種較為簡便的方法,因為只需要返回下標即可,因為是有序陣列,我們首先判斷目標值是否在陣列中,如果在,返回下標即可;如果不在並且大於最後乙個元素,就只需要在陣列長度上加1即可。
**如下:
public
intsearchinsert
(int
nums,
int target)
}return nums.length;
//如果target比陣列中所有的數都大if語句就進不去了,這時就要返回到陣列最後一位的後面
}
leetcode第112題:給定乙個二叉樹和乙個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等於目標和。
解析:二叉樹由於其特殊的結構,大部分的問題都可以使用遞迴來解決,關於遞迴的理解與分析可以參見遞迴的解題思路,這題也不列外。深度優先遍歷二叉樹,每深入一次,sum-根節點的值,當到達葉子節點的時候,判斷sum是否等於當前的節點值,如果等於,說明找到了,否則嘗試另外一條路徑。
**如下:
boolean ans =
false
;public
boolean
haspathsum
(treenode root,
int sum)
dfs(root, sum)
;return ans;
}public
void
dfs(treenode root,
int sum)
if(root.left == null && root.right == null)
}dfs
(root.left, sum - root.val)
;dfs
(root.right, sum - root.val)
;}
詳細的解題過程可以參見: 演算法之尋找二維矩陣中的目標值
編寫乙個高效的演算法來搜尋 m x n 矩陣 matrix 中的乙個目標值 target。該矩陣具有以下特性 每行的元素從左到右公升序排列。每列的元素從上到下公升序排列。示例 現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,14,17...
子集和的目標值
題目描述 給定n個整數和目標值t,求某一非空子集使子集的元素的和與目標值之差的絕對值最小,元素可重複。輸入描述 第一行為整數n t。n為整數個數,t為目標值 第二行為n個整數ai。輸出描述 乙個整數,為差的最小值的絕對值。樣例輸入 5 91 1 1 4 17 樣例輸出 2 資料範圍及提示 1 n 1...
兩數之和等於目標值
給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數,將這兩個數通過另乙個陣列返回。可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9,所以返回 0,1 第一種方法 使用兩層for...