396.Rotate Function(M)

题目描述

给定一个数组A,n是它的长度。假定Bk为将数组A循环右移k位后的结果。我们定义一个 旋转函数F,如下:
这里写图片描述
求F(0),F(1),…,F(n-1)中的最大值
原题以及例子如下,
这里写图片描述
如果没有时间的限制,那么这道题可以很容易的使用暴力求解法。可惜并不能。那么这个时候就要观察了,既然不能暴力求解,那么F(k)之间肯定会存在一种联系。这里有个很巧妙的地方,如下所示
Bk[i] = Bk-1[i -1](i != 0)
Bk[0] = Bk-1[n - 1]
由上面两个式子可以得到
F(k) = 0 * Bk-1[n-1] + 1 * Bk-1[0] + … + (n-1)Bk-1[n-2]
F(k-1) = 0 * Bk-1[0] + 1 * Bk-1[1] + … + (n-1)Bk-1[n-1]
F(k) - F(k-1) = Bk-1[0] + Bk-1[1] + … + Bk-1[n-2] + Bk-1[n-1] - n*Bk-1[n-1]
很明显,前面的n项为数组A中所有元素之和,很容易就得到了F(k)与F(k-1)之间的关系,减少了很大的计算量。这种题代码量一般都不大,主要是能观察出他们之间的关系。之后慢慢计算就好了,具体代码如下,

class Solution {
public:
    int maxRotateFunction(vector<int>& A) {
       int sum = 0, temp = 0;
       int size = A.size();
       for (int i = 0; i < size; ++i) {
           sum += A[i];
           temp += i * A[i];
        }
        int max = temp;
        for (int i = 1; i < size; ++i) {
            int pos = size - i;
            temp = sum + temp - size  * A[pos];
            max = max > temp ? max : temp;
        }
        return max;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
var layout = d3.layout.cloud() .size([500, 300]) .words(theme) // wordList.map(function(d) { // return {text: d, size: 10 + Math.random() * 50}; // }) .padding(5) .rotate(function() { return ~~(Math.random() * 1) * 90; }) .font("STXinwei") .fontSize(function(d) { return d.size; }) .on("end", draw); layout.start(); function draw(words) { d3.select(".wordcloud").html(""); //enter var mywords=d3.select(".wordcloud") .append("svg") .attr("width", layout.size()[0]) .attr("height", layout.size()[1]) .append("g") .attr("transform", "translate(" + layout.size()[0] / 2 + "," + layout.size()[1] / 2 + ")") .selectAll("text") .data(words) .enter() .append("text") .attr("class","word") .style("font-size", function(d) { return d.size + "px"; }) .style("font-family", "STXinwei") .style("fill", function(d, i) { fill(i); }) .attr("text-anchor", "middle") .attr("transform", function(d) { return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")"; }) .text(function(d) { // console.log(d.word); return d.word; })//这里要用d,而不是用i .on("mouseover",function(d,i){ d3.select(this) .transition() .duration(500) .attr("fill","gray"); d3.select(this) .select("text") .text(d.size) .attr("class",".poems"); // return d.size; }) .on("mouseout",function(d,i){ d3.select(this) .transition() .duration(1000) .attr("fill","black"); }) .on("click", function(d,i) { // console.log(i); // console.log(i.word); // console.log(d); showPoems(i.word); })//这里要用i,而不是用d .append("title") .text(function(d){ return "使用次数:"+d.size+"次"; }); 修改上述代码使得词云的显示集中在某个固定的多边形内,词与词之间越紧密越好
最新发布
06-06

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值