やったいくつかの面白いアルゴリズムの問題(解法付き)
2039 ワード
問題1:HZはたまに専門的な問題を持ってコンピュータ以外の学生をからかっている.今日のテストグループの会議が終わった後、彼はまた話をしました:古い1次元モードの識別の中で、いつも連続するサブベクトルの最大和を計算する必要があって、ベクトルがすべて正数の時、問題はとてもよく解決します.しかし、ベクトルに負の数が含まれている場合、ある負の数を含んで、隣の正の数が補うことを期待しますか?例えば,{6,−3,−2,7,−15,1,2,2},連続サブベクトルの最大和は8(0番目から3番目まで)である.配列をあげて、その最大連続サブシーケンスの和を返して、あなたは彼にだまされませんか?(サブベクトルの長さは少なくとも1)
解答:動的に計画して、すべての正の答えを列挙します
問題2:文字列(配列)abcdのすべての組合せをリストする可能性のあるスキーム
解答:遡及法、すべての状況をリストして、それからlua解法を探して次のようにします
タイトル3:1回の購入と1回の販売が可能であれば、購入は前にしなければならない.最大収益を求める.
解答3:欲張りアルゴリズム
解答:動的に計画して、すべての正の答えを列挙します
# -*- coding:utf-8 -*-
class Solution:
def FindGreatestSumOfSubArray(self, array):
if not array:
return 0
dp = [array[0]]
i = 1
for num in array[1:]:
if dp[i - 1] <= 0: # , ,
dp.append(num)
else:
dp.append(dp[i - 1] + num)
i += 1
return max(dp)
a = Solution()
array = [6, -3, -2, 7, -15, 1, 2, 2]
b = a.FindGreatestSumOfSubArray(array)
print b
問題2:文字列(配列)abcdのすべての組合せをリストする可能性のあるスキーム
解答:遡及法、すべての状況をリストして、それからlua解法を探して次のようにします
local Solution = {
local allsolution = {}
local insertyouranswer = {"a","b","c","d"}
function dfs(dep, vecNum) --
if dep == #insertyouranswer then
table.insert(allsolution,vecNum) -- ,
return
end
for idx = dep ,#insertyouranswer do
swap(insertyouranswer[dep],insertyouranswer[idx])
dfs(dep+1,insertyouranswer)
swap(insertyouranswer[dep],insertyouranswer[idx])
end
end
}
タイトル3:1回の購入と1回の販売が可能であれば、購入は前にしなければならない.最大収益を求める.
解答3:欲張りアルゴリズム
, i , i 。
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0)
return 0;
int soFarMin = prices[0];
int maxProfit = 0;
for (int i = 1; i < prices.length; i++) {
soFarMin = Math.min(soFarMin, prices[i]);
maxProfit = Math.max(maxProfit, prices[i] - soFarMin);
}
return maxProfit;
}