藍橋杯練習題數組(合併兩個有序數組,買賣股票的最佳時機,矩陣置零)

題目:合併兩個有序數組
給定兩個有序整數數組 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章