題目:合併兩個有序數組
給定兩個有序整數數組 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成爲一個有序數組。
說明:
初始化 nums1 和 nums2 的元素數量分別爲 m 和 n。
你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。
示例:
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
代碼:
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p =m+n-1;
m--;n--;
while(m>=0 && n>=0)
nums1[p--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
while(n >= 0)
nums1[p--] = nums2[n--];
while(m >= 0)
nums1[p--] = nums1[m--];
}
題目:. 買賣股票的最佳時機 I
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。
注意你不能在買入股票前賣出股票。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,
最大利潤 = 6-1 = 5 。
注意利潤不能是 7-1 = 6, 因爲賣出價格需要大於買入價格。
示例 2:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤爲 0。
方法一:暴力法
public int maxProfit(int prices[]) {
int maxprofit = 0;
for (int i = 0; i < prices.length - 1; i++) {
for (int j = i + 1; j < prices.length; j++) {
int profit = prices[j] - prices[i];
if (profit > maxprofit)
maxprofit = profit;
}
}
return maxprofit;
}
方法二:一次遍歷
public int maxProfit(int prices[]) {
int maxprofit = 0;
int minprice = Integer.MAX_VALUE;
for(int i=0;i<prices.length;i++){
//用if else 來解決了需要兩次比較的問題
if(prices[i] < minprice)
minprice = prices[i];
else if(prices[i] - minprice > maxprofit)
maxprofit = prices[i] - minprice;
}
return maxprofit;
}
題目:. 買賣股票的最佳時機 II
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
設計一個算法來計算你所能獲取的最大利潤。你可以儘可能地完成更多的交易(多次買賣一支股票)。
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出,
這筆交易所能獲得利潤 = 5-1 = 4 。
隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,
這筆交易所能獲得利潤 = 6-3 = 3 。
示例 2:
輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出,
這筆交易所能獲得利潤 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。
因爲這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。
示例 3:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤爲 0。
代碼: public int maxProfit(int[] prices) {
int days=prices.length;
if(days<=1) return 0;
//思考過後發現,只要在降價的前一天賣掉就可以了。
int ans=0;
int i=1,min=prices[0];
while(i<days)
{
if(prices[i]>=prices[i-1]) i++;
else{
//如果降價就賣掉
ans+=prices[i-1] - min;
min=prices[i];
i++;
}
}
ans+= Math.max(0,prices[days-1]-min);
return ans;
}
題目:矩陣置零
給定一個 m x n 的矩陣,如果一個元素爲 0,則將其所在行和列的所有元素都設爲 0。請使用原地算法。
示例 1:
輸入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
輸出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
代碼:
思路:先把所有爲0的 ij分別用數據流記錄然後在一個一個選取數據流中的數偶數爲i 奇數爲j
遇到的問題,注意類型的轉換,此處sb裏取出的值是char型,如果強制轉換會ASCII碼,可以
考慮用char - '0'
注意2:其中越界的問題,sb 的長度一定是偶數 處理相關越界問題
自己寫的代碼這個無法通過
[[1]]
代碼:
public static void setZeroes(int[][] matrix) {
StringBuffer sb = new StringBuffer();
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
if(matrix[i][j] == 0) {
sb.append(i);
sb.append(j);
}
}
}
int length = sb.length();
int k = 1;
int s =0;
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(i ==sb.charAt(s)-'0') {
matrix[i][j] = 0;
if(s<length-2) s = s+2;
}
if(j ==sb.charAt(k)-'0') {
matrix[i][j] = 0;
if(k<length-1) k = k+2;
}
}
}
}
時間:2019.1.22