【Lintcode】970. Big Business(配數學證明)
題目地址:
https://www.lintcode.com/problem/big-business/description
給定兩個陣列 a a a和 b b b, a [ i ] a[i] a[i]代表商品 i i i的成本, b [ i ] b[i] b[i]代表商品的賣價。初始資金是 k k k,問通過交易,最後能達到的最大資金是多少。每個商品最多隻能買賣一次。
思路是貪心。直覺上來講,最貴的商品可能一下子買不起,那可以先買便宜的商品,賺了錢之後看看能不能再買更貴的商品。所以思路就是,先將所有商品按成本由低到高排序,然後依次買賣。如果到達某個商品發現買不起了,則退出迴圈。當然那些賣價小於等於買價的商品不用看,直接略過。
演算法正確性證明:
設兩個商品分別是
(
c
1
,
s
1
)
(c_1,s_1)
(c1,s1)和
(
c
2
,
s
2
)
(c_2,s_2)
(c2,s2),並且
c
1
<
c
2
c_1<c_2
c1<c2,容易證明先買賣便宜的商品
1
1
1,賺到了錢再買賣商品
2
2
2,得到的最終的資金是一定更優於(或者一樣)先買賣商品
2
2
2後商品
1
1
1的,原因是商品
2
2
2有可能一下子買不起,而交易完商品
1
1
1後賺了錢,就有可能買得起了。所以如果某個最優解不是按這樣的順序交易的,我們總可以將最便宜的商品向前交換位置,每次交換位置都能得到最優解(因為交換完更優,而當前就是最優解了,所以更優解也是最優解),再由數學歸納法就能證明按成本從小到大的順序交易是最優的。
程式碼如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
class Movie {
int cost, price;
public Movie(int cost, int price) {
this.cost = cost;
this.price = price;
}
}
/**
* @param a: The cost of the film
* @param b: The price of the selling of the film
* @param k: The principal
* @return: The answer
*/
public int bigBusiness(int[] a, int[] b, int k) {
// Write your code here
List<Movie> movies = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
if (a[i] < b[i]) {
movies.add(new Movie(a[i], b[i]));
}
}
// 按成本排序
movies.sort((m1, m2) -> Integer.compare(m1.cost, m2.cost));
for (Movie movie : movies) {
// 買得起就買,賺的利潤,否則就說明當前及之後的電影都是買不起的,則退出迴圈
if (k >= movie.cost) {
k += movie.price - movie.cost;
} else {
break;
}
}
return k;
}
}
時間複雜度 O ( n log n ) O(n\log n) O(nlogn),空間 O ( n ) O(n) O(n)。
相關文章
- 數學證明 學習筆記筆記
- 【Leetcode】1689. Partitioning Into Minimum Number Of Deci-Binary Numbers(配數學證明)LeetCode
- 無需語言的數學證明,值得收藏!
- 數論裡的尤拉定理,試證明
- Jensen 不等式證明(數形結合)
- Lintcode 反轉整數
- LintCode 刪除數字
- 程式 · 雜談 | DeepSeek釋出最強開源數學定理證明模型模型
- 《圖靈的祕密》可計算數的證明 寫給程式設計師看的數學圖靈程式設計師
- 【ASM學習】ASM引數說明ASM
- [LintCode]NumberofIslands(島嶼個數)
- 如何證明所有自然數的和等於-1/12?
- 卡特蘭數關於凸多邊形的證明
- MySQL數學函式簡明總結MySql函式
- 零知識證明: Tornado Cash 專案學習
- 歸約證明在密碼學中的應用密碼學
- 斐波那契數列的通項公式及證明公式
- 【函式】證明:若兩線垂直,斜率互為反倒數函式
- LintCode 用遞迴列印數字遞迴
- Chapter 4 證明技巧APT
- iOS10推送適配完整說明iOS
- AI將是數學家的得力助手,陶哲軒談AI在證明過程中的潛力AI
- 2.2 工作量證明
- bitcoin 與存在性證明
- big_endian和little_endian的說明(轉載)
- 讀天才與演算法:人腦與AI的數學思維筆記13_Coq證明助手演算法AI筆記
- watchOS 學習筆記 | Big Picture筆記
- LVM與磁碟配額(包含磁碟配額與驗證實操)LVM
- 4.5 工作量證明——PoW
- 工作量證明挖礦
- 初識零知識證明
- dijkstra 複雜度證明複雜度
- sin/cos(α+β) 的展開證明
- OI 數論中的上界估計與時間複雜度證明時間複雜度
- PRINCE2專案管理初探之一:商業論證(Business Case)專案管理
- lintcode演算法題 落單的數 JavaScript演算法JavaScript
- 哲學家啟動研究 :數學是發明還是發現?- dailynousAI
- 網路流複雜度證明複雜度