力扣题:数组的旋转-9.26

力扣题-9.26

[力扣刷题攻略] Re:从零开始的力扣刷题生活

力扣题1:189. 旋转数组

解题思想:
1.每次都往后移一位,重复k次(超出时间限制)
2.使用新内存,遍历1次数组放置在相应的位置
3.实际上就是从后往前数k位进行隔断后,将前半部分和后半部分进行位置的调换
4.官方解释:先将数组整个翻转,再对前部分和后部分分别进行翻转

力扣题:数组的旋转-9.26_第1张图片
方法2:

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        copy = [0 for i in range(len(nums))]
        for i in range(len(nums)):
            copy[(i+k)%len(nums)] = nums[i]
        for i in range(len(nums)):
            nums[i] = copy[i]
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        vector<int> copy(nums.size());
        for(int i = 0; i<nums.size(); i++){
            copy[ (i+k) % nums.size()] = nums[i];
        }
        for(int i = 0; i<nums.size(); i++){
            nums[i] = copy[i];
        }
    }
};

方法3:

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        nums[:] = nums[-k:] + nums[:-k]

方法4:

class Solution {
public:
    void rotate(vector<int>& nums, int k) 
	{
        k=k%nums.size();
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+k);
        reverse(nums.begin()+k,nums.end());
    }
};

力扣题2:396. 旋转函数

解题思想:
1.暴力求解(超出时间限制)
2.通过数学方式推导F(n)与F(n-1)之间的关系:F(k)=F(k−1)+numSum−n×nums[n−k]
力扣题:数组的旋转-9.26_第2张图片

class Solution(object):
    def maxRotateFunction(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        total = sum(nums)
        result = 0
        fn = 0
        for i in range(len(nums)):
            fn = fn+i*nums[i]
        result = fn
        for i in range(1,len(nums)):
            print(len(nums)-i)
            fn = fn + total -len(nums)*nums[len(nums)-i]
            if fn>result:
                result = fn
        return result
class Solution {
public:
    int maxRotateFunction(vector<int>& nums) {
        int total = 0;
        int result = 0;
        int fn = 0;
        for (int i = 0; i < nums.size(); i++) {
            total += nums[i];
            fn += i * nums[i];
        }
        result = fn;
        for (int i = 1; i < nums.size(); i++) {
            fn = fn + total -nums.size()*nums[nums.size()-i];
            if (fn>result){
                result = fn;
            }
        }
        return result;
    }
};

你可能感兴趣的:(leetcode)