日新计划 · 04-09

108 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

注:仅作为个人学习笔记记录

@TOC

在这里插入图片描述

前言

Hello!小伙伴!

非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~  

自我介绍 ଘ(੭ˊᵕˋ)੭

昵称:海轰

标签:程序猿|C++选手|学生

简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。

学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!   唯有努力💪  

文章仅作为自己的学习笔记 用于知识体系建立以及复习

知其然 知其所以然!

每日一题

396. 旋转函数

在这里插入图片描述 思路:

  • 模拟
  • 生成一个label数组 0 1 2 3 ....
  • 然后再对这个数组进行旋转
  • 再与nums相乘
class Solution {
public:
    vector<int> shift(vector<int>& nums) {
        int n = nums.size();
        int tmp = nums[0];
        for(int i = 1; i < n; ++i) {
            nums[i - 1] = nums[i];
        }
        nums[n - 1] = tmp;
        return nums;
    }
    int sumOfVec(vector<int> nums, vector<int> label) {
        int n = nums.size();
        int res = 0;
        for(int i = 0; i < n; ++i) {
            res += (nums[i] * label[i]);
        }
        return res;
    }
    int maxRotateFunction(vector<int>& nums) {
        int n = nums.size();
        int ans = INT_MIN;
        vector<int> label;
        for(int i = 0; i < n; ++i) {
            label.push_back(i);
        } 
        for(int i = 0; i <= n; ++i) {
            ans = max(sumOfVec(nums, shift(label)), ans);
        }
        return ans;
    }
};

在这里插入图片描述

emmm 仔细一想

直接旋转原数组不就行了 为啥还要多一个label(脑子what了)

class Solution {
public:
    vector<int> shift(vector<int>& nums) {
        int n = nums.size();
        int tmp = nums[0];
        for(int i = 1; i < n; ++i) {
            nums[i - 1] = nums[i];
        }
        nums[n - 1] = tmp;
        return nums;
    }
    int maxRotateFunction(vector<int>& nums) {
        int n = nums.size();
        int ans = INT_MIN;
        vector<int> label;
        for(int i = 0; i < n; ++i) {
            label.push_back(i);
        } 
        for(int i = 0; i <= n; ++i) {
            nums = shift(nums);
            int tmp = 0;
            for(int j = 0; j < n; ++j) {
                tmp += (nums[j] * j);
            }
            ans = max(ans, tmp);
        }
        return ans;
    }
};

在这里插入图片描述 查看官方题解后

可以发现一种迭代关系: 在这里插入图片描述 注: numSum = 1 * nums[0] + 1 * nums[1] + .... + 1 * nums[n-1]

class Solution {
public:
    int maxRotateFunction(vector<int>& nums) {
        int n = nums.size();
        int sumOfNums = accumulate(nums.begin(), nums.end(), 0);
        int f = 0;
        for(int i = 0; i < n; ++i) {
            f += i * nums[i];
        }
        int ans = f;
        for(int i = 1; i < n; ++i) {
            f += (sumOfNums - n * nums[n - i]);
            ans = max(f, ans);
        }
        return ans;
    }
};

在这里插入图片描述

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述