796
简单的字符串操作
797
深度优先搜索
非常简洁的实现,还是要学习的
简洁之处:
没有使用我全局定义的 ans
和 path
ans 和path 在这种情境下被统一起来,最终也没有进行回退,每一次都是新的拷贝创建

class Solution(object):
    def allPathsSourceTarget(self, graph):
        N = len(graph)
        def solve(node):
            if node == N-1: return [[N-1]]
            ans = []
            for nei in graph[node]:
                for path in solve(nei):
                    ans.append([node] + path)
            return ans

        return solve(0)

798
最小旋转最大得分
计算初始分数,在每个旋转点时的得分和失分
如果直接(对于每一个位置算一边,但是注意到相邻的位置实际上大量的重复)进行统计比较麻烦的话,采取这种算边际损失量的方法不失为一种好方法

class Solution {
private:
	int n;
	int in[20001];
	int out[20001];
	void pro(int k,int i){
		if(k>i){
			in[i+1]++;
			out[i+n-k+1]++;
		}else {
			in[i+1]++;
			out[i-k+1]++;
		}
	}
public:
    int bestRotation(vector<int>& A) {
    	memset(in,0,sizeof(in));
    	memset(out,0,sizeof(out));
    	n=A.size();
		for(int i=0;i<n;i++){
			pro(A[i],i);
		}  
		int s=0;
		int bests=-1;
		int besti=-1;
//		int besti=0;
		for(int i=0;i<n;i++){
			if(A[i]<=i){
				s++;
			}
		}
		if(bests<s){
			bests=s;
			besti=0;
		}
		for(int i=1;i<n;i++){
			s+=in[i];
			s-=out[i];
			if(bests<s){
				bests=s;
				besti=i;
			}
		}
		return besti;
    }
};

附 我的naive 思路没有问题 但是有更好的解决方法
五行解决问题

    int bestRotation(vector<int>& A) {
        int N = A.size();
        int change[N] = {0};
        for (int i = 0; i < N; ++i) change[(i - A[i] + 1 + N) % N] -= 1;
        for (int i = 1; i < N; ++i) change[i] += change[i - 1] + 1;
        return distance(change, max_element(change, change + N));
    }

我还是有几个关键的点没有观察到

  • k++时会且仅会多得一分
  • 而且减分的时候 都是index 和 value 的差值加1 最后取正模就好
  • 不用计算初始的分值,只用计算中途
  • 加分过程与累计合并,简化代码
  • 累积起来以后用 max_element得到最大一个只对应的迭代器,使用distance 得到迭代器 也就是需要的代码
    java
  public int bestRotation(int[] A) {
        int N = A.length;
        int change[] = new int[N];
        for (int i = 0; i < N; ++i) change[(i - A[i] + 1 + N) % N] -= 1;
        int max_i = 0;
        for (int i = 1; i < N; ++i) {
            change[i] += change[i - 1] + 1;
            max_i = change[i] > change[max_i] ? i : max_i;
        }
        return max_i;
    }

python

   def bestRotation(self, A):
        N = len(A)
        change = [1] * N
        for i in range(N): change[(i - A[i] + 1) % N] -= 1
        for i in range(1, N): change[i] += change[i - 1]
        return change.index(max(change))

python中 [1] *N 的用法也是我不会的。(批量初始化

799
倒水,但是考虑问题的时候总是想递归的进行,跟随时间进行,
实际上没有必要,直接按照总量的水溢出问题就会简单许多,问题虽然是和时间高度相关的,但是最后的问题所在没有与时间相关,于是可以直接计算终态

class Solution {
private:
	double w[102][102];
public:
    double champagneTower(int poured, int query_row, int query_glass) {
		memset(w,0,sizeof(w));
    	w[0][0]=poured;
    	bool flag=true;
    	int  row=0;
    	double ans=0;
    	while(flag){
    		if(row==query_row){
    			ans=w[row][query_glass];
    			break;
			}
			flag=false;
			for(int i=0;i<=row;i++){
				if(w[row][i]>1){
					w[row+1][i]+=(w[row][i]-1)/2;
					w[row+1][1+i]+=(w[row][i]-1)/2;
					flag=true;
				}
			}
			row++;
		}
		return ans>1?1:ans; 
    }
};

Python的快速解决方案

class Solution(object):
    def champagneTower(self, poured, query_row, query_glass):
        A = [[0] * k for k in xrange(1, 102)]
        A[0][0] = poured
        for r in xrange(query_row + 1):
            for c in xrange(r+1):
                q = (A[r][c] - 1.0) / 2.0
                if q > 0:
                    A[r+1][c] += q
                    A[r+1][c+1] += q

        return min(1, A[query_row][query_glass])