zoukankan      html  css  js  c++  java
  • leetcode@ [134] Gas station (Dynamic Programming)

    https://leetcode.com/problems/gas-station/

    题目:

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i].

    You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with an empty tank at one of the gas stations.

    Return the starting gas station's index if you can travel around the circuit once, otherwise return -1.

    Note:
    The solution is guaranteed to be unique.

    class Solution {
    public:
        int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
            int n = gas.size();
            if(n == 0) return -1;
            if(n == 1) {
                if(gas[0] - cost[0] >= 0)  return 0;
                return -1;
            }
            
            vector<int> dif; dif.clear();
            for(int i=0;i<n;++i) dif.push_back(gas[i] - cost[i]);
            for(int i=0;i<n-1;++i) dif.push_back(gas[i] - cost[i]);
            
            vector<int> sum(2*n-1, 0);
            vector<int> dp(2*n-1, 0);
            sum[0] = dif[0];
            dp[0] = 1;
            
            for(int i=1;i<2*n-1;++i) {
                if(sum[i-1] < 0) {
                    sum[i] = dif[i];
                    dp[i] = 1;
                }
                else {
                    sum[i] = sum[i-1] + dif[i];
                    dp[i] = dp[i-1] + 1;
                }
                
                if(dp[i] == n && sum[i] >= 0) return i-n+1;
            }
            
            return -1;
        }
    };
    View Code

    这里正好可以引申一个:环形数组的最大子数组和问题。解决这个问题就是把“环形” 变成 “直线型”。比如: 原来的环形数组为 v[0], v[1], ..., v[n-1]. 可以在v[n-1] 后面继续放置 v[0], v[1], ..., v[n-1]. 然后我们对这个新的数组求解:最大子数组和问题。但是这里也有一个问题,就是求解出来的最大子数组可能长度会超过n,所以我们维护两个变量:sum[i] 和 len[i]。sum[i] 记录以a[i] 为结束位置的最大子数组和,而len[i] 记录以a[i] 为结束位置的最大子数组的长度。最终的答案可以找当len[i] <= n 的时候, sum[i] 最大的值。

    int res = INT_MIN;
    vector<int> sum(n, 0);
    vector<int> len(n, 0);
    
    sum[0] <- v[0];      len[0] <- 1;
    
    for(i<-1 TO 2*n) {
         if(sum[i-1] < 0) {
            sum[i] <- v[i]
            len[i] <- 1
         }
         else {
            sum[i] <- sum[i-1] + v[i]
            len[i] <- len[i-1] + 1  
         }
         if(len[i] <= n) res <- max{res, sum[i]);
    }
    
    return res;
  • 相关阅读:
    笔记44 Hibernate快速入门(一)
    tomcat 启用https协议
    笔记43 Spring Security简介
    笔记43 Spring Web Flow——订购披萨应用详解
    笔记42 Spring Web Flow——Demo(2)
    笔记41 Spring Web Flow——Demo
    Perfect Squares
    Factorial Trailing Zeroes
    Excel Sheet Column Title
    Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/fu11211129/p/5103305.html
Copyright © 2011-2022 走看看