leetcode周期小结2

2人阅读 评论(0) 收藏 举报
分类:

以下更好的解法均来自网络

6.Z字形变换

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

P   A   H   N
A P L S I I G
Y   I   R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) 应当返回 "PAHNAPLSIIGYIR" 。

个人解法:先用算出同一列中两个元素的关系,然后循环,循环。。。

class Solution {
     public static String convert(String s, int numRows) {
        int distance= 2*numRows-2;
        int eachpart=distance-1;
        if(numRows==1) return s;
        else
        return function(s,0,0,numRows,0);
    }

    public static String function(String s,int nowrow,int distance,int numRows,int nownum)  {
        if(nowrow==numRows)      return "";
        if(nownum>=s.length())   return  function(s,nowrow+1,2*numRows-2-2*(nowrow+1),numRows,nowrow+1);
        if(nowrow==0)            return  s.charAt(nownum)+function(s,nowrow,2*numRows-2,numRows,nownum+2*numRows-2)  ;
        if(nowrow==numRows-1)    return  s.charAt(nownum)+function(s,nowrow,2*numRows-2,numRows,nownum+2*numRows-2)  ;
        return     s.charAt(nownum)+function(s,nowrow,2*numRows-2-distance,numRows,nownum+distance)  ;
    }

}


更好的解法:

输入:一个字符串和行数

首先将string转换为字符数组使用toCharArray()
所以每一行用一个StringBuilder对象来保存,因为可以更改其值。
主要确定好两个方向的位置,竖向和倾斜。只需要控制好sb的下标即可。

注意:
在控制sb下标的同时也一定要控制字符数组的下标,防止越界。

public class Solution {
    public String convert(String s, int numRows) {

        char[] c=s.toCharArray();

        StringBuilder[] sb=new StringBuilder[numRows];

        for(int i=0;i<numRows;i++)
        {
            sb[i]=new StringBuilder();
        }

        int k=0;
        while(k<s.length())
        {
            for(int i=0;i<numRows && k<s.length();i++)
            {
                sb[i].append(c[k++]);
            }

            for(int i=numRows-2;i>=1 && k<s.length();i--)
            {
                sb[i].append(c[k++]);
            }


        }


        StringBuilder result=new StringBuilder();
        for(int i=0;i<numRows;i++)
        {
            result.append(sb[i]);
        }

        return result.toString(); 




    }
}

14.最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

个人解法:以第一个字符串的全部为基准,每扫描一个逐渐减少

class Solution(object):
    def longestCommonPrefix(self, strs):
        if strs == []:
            return ""
        if len(strs)==1:
            return strs[0]
        left = 0
        right = len(strs[0])
        for i in range(0, len(strs)):

            if right >len(strs[i]):
                right = len(strs[i])
            a = self.check(strs, i, left, right)
            right=a
        result=""
        for i in range(0,right):
            result=result+strs[0][i]
        return result

    def check(self, strs, pos, left, right):
        
        for i in range(left, right):
            if strs[pos][i] == strs[0][i]:
                pass
            else:
                return i

        return right

更好的解法:有待寻找


45.跳跃游戏2

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

例如: 
给定数组 A = [2,3,1,1,4]

跳到最后一个位置的最小跳跃数是 2。(从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。)

注意:

假设你总是可以到达数组的最后一个位置。

个人解法:贪心算法,并记录下上次检索的最右端来减少下次所需检索的元素数量

写的时候可以变成:每次检索元素的时候都与前面能跳最远的比较(n),然后只考虑什么时候counter需要+1就好了

class Solution:
    def jump(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums)==1:
            return 0
        pos=0
        temppos=0
        counter=0
        for i in range(0,len(nums)):
            if nums[i]+i>=len(nums)-1:
                if i<=nums[pos]+pos and i>pos:
                    return counter+2
                else:
                    return counter+1

            temppos=self.max(temppos,i,nums)


            if i==nums[pos]+pos:
                counter=counter+1
                pos=temppos



    def max(self, a, b,nums):
        if nums[a]+a>nums[b]+b:
            return a
        else:

            return b

更好的解法:待定


495.提莫攻击

在《英雄联盟》的世界中,有一个叫“提莫”的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒状态总时长。

你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。

示例1:

输入: [1,4], 2
输出: 4
原因: 在第1秒开始时,提莫开始对艾希进行攻击并使其立即中毒。中毒状态会维持2秒钟,直到第2秒钟结束。
在第4秒开始时,提莫再次攻击艾希,使得艾希获得另外2秒的中毒时间。
所以最终输出4秒。

示例2:

输入: [1,2], 2
输出: 3
原因: 在第1秒开始时,提莫开始对艾希进行攻击并使其立即中毒。中毒状态会维持2秒钟,直到第2秒钟结束。
但是在第2秒开始时,提莫再次攻击了已经处于中毒状态的艾希。
由于中毒状态不可叠加,提莫在第2秒开始时的这次攻击会在第3秒钟结束。
所以最终输出3。


个人解法:递归,遍历,尽量用if来减少赋值的时间

class Solution {
   public static int findPoisonedDuration(int[] timeSeries, int duration) {
       if(timeSeries.length==0)
           return 0;
       else
           return run(timeSeries,duration,0);
    }
    static int p;
    public static int run(int[] timeSeries,int duration,int now)
    {

        if(now>=timeSeries.length-1)
         { return duration;}
         else
        {  p=timeSeries[now+1]-timeSeries[now];}

        return (p>=duration?duration:p)+run(timeSeries,duration,now+1);
    }
    

}

更好的解法:待寻

605.种花问题

假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。

给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 。能否在不打破种植规则的情况下种入 朵花?能则返回True,不能则返回False。

示例 1:

输入: flowerbed = [1,0,0,0,1], n = 1
输出: True

示例 2:

输入: flowerbed = [1,0,0,0,1], n = 2
输出: False

注意:

  1. 数组内已种好的花不会违反种植规则。
  2. 输入的数组长度范围为 [1, 20000]。
  3. n 是非负整数,且不会超过输入数组的大小。

个人解法:暴力遍历,检测是否符合情况,赋值

class Solution {
       public static boolean canPlaceFlowers(int[] flowerbed, int n) {
        if(n==0) return true;
        if(flowerbed.length==1){if(flowerbed[0]==0&&n<=1) return true;else return false;}
       for(int i=0;i<flowerbed.length;i++)
       {
           if(check(flowerbed,i)==true) {n--;flowerbed[i]=1;}
           if(n==0) return true;
       }
       return false;

    }


    public static boolean check(int[] flowerbed, int pos){
            if (pos == 0)
            if (flowerbed[pos] == 0 && flowerbed[pos + 1] == 0)
            return true;
            else
                    return false;
        if (pos == flowerbed.length - 1)
            if (flowerbed[pos] == 0 & flowerbed[pos - 1] == 0)
            return true;
            else
                    return false;
        if(flowerbed[pos] == 0 && flowerbed[pos + 1] == 0 && flowerbed[pos - 1] == 0)
            return true;
        else
                return false;

}

}

更好的解法:计算两个1之间有几个数,即可确定最大能放多少

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
    
    int l = -2;
    int r;
    int sum = 0;
    for (r = 0; r < flowerbedSize; ++r){
        if (flowerbed[r] == 1){
            sum = sum + floor((r-l-2) / 2.0);
            l = r;
        }
    }
    sum = sum + floor((flowerbedSize-l-1) / 2.0);
    
    return sum>=n?true:false;
}








查看评论

LeetCode 高频题目

Leetcode Single Number II  Leetcode Single Number Leetcode Best Time to Buy a...
  • imabluefish
  • imabluefish
  • 2014-08-25 17:22:39
  • 4786

leetcode周期小结1

以下所有更好的解法均来自网络1.两数之和题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定 nums = [2,...
  • qq_36583984
  • qq_36583984
  • 2018-04-15 01:57:21
  • 3

斐波那契数列的余数周期问题

斐波那契数列的余数周期问题 斐波那契余数周期性的原理 设En,kE_{n,k}为斐波那契数列对kk的余数数列,那么可以得到此数列的递推公式为 En+2,k=(En+1,k+En,k)mod(k)\...
  • lygztq
  • lygztq
  • 2017-07-04 12:00:15
  • 195

LeetCode动态规划归纳

LeetCode动态规划归纳最近刷了很多动态规划的问题,归纳一下做动态规划的题的方法。动态规划很多题目是解决最多最少最大最小的问题。动态规划问题的基本做法是: 确定递推量 推出递推式 确定边界 在解决...
  • King_Like_Coding
  • King_Like_Coding
  • 2016-10-23 20:14:59
  • 611

2017年2月8日 实习初贴(第一次总结)

加上年前年后的时间,到今天为止已经在Intel虚拟化部门实习了13天。实习所参与的项目是开源项目,属于Intel OTC(Open Source Technology Center),是OTC众多项目...
  • CoderHattonLiu
  • CoderHattonLiu
  • 2017-02-08 23:16:33
  • 654

刷LeetCode刷LeetCode刷LeetCode刷LeetCode

  • 2018年01月09日 15:07
  • 1.55MB
  • 下载

LeetCode 问题汇总(算法,难度,频率)

Id Question Difficulty Frequency Data Structures Algorithms 1 T...
  • sbitswc
  • sbitswc
  • 2014-03-13 11:58:30
  • 12356

周期串问题(一)

题目: 题目一[周期串问题] 如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也可以6和12为周期,结果取最小周期3...
  • u011068702
  • u011068702
  • 2016-08-09 23:43:55
  • 457

Leetcode 650. 2 Keys Keyboard 2指键盘 解题报告

这道题可以转化成,给一个数字N,初始K=1,C=0然后只允许你有两种操作: 1、K = K + C (paste) 2 、C = K (copy all) 问,如何操作可以使得最快的得到NN>1...
  • MebiuW
  • MebiuW
  • 2017-08-03 22:11:38
  • 1688

Leetcode 650. 2 Keys Keyboard

题目Initially on a notepad only one character 'A' is present. You can perform two operations on this n...
  • u014252563
  • u014252563
  • 2017-08-13 14:17:53
  • 2189
    个人资料
    等级:
    访问量: 8
    积分: 30
    排名: 199万+
    文章分类
    文章存档