leetcode数组题

leetcode数组题

第一次写博客,还不会怎么会用markdown,先弄个简单的题,立个flag以后每天都刷题更新,从数组刷起

1、转置矩阵 #867

题型描述:
给定一个矩阵 A, 返回 A 的转置矩阵。
矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

示例 1:
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]

java版
class Solution {
    public int[][] transpose(int[][] A) {
        int col_len=A[0].length;
        int row_len=A.length;
        int[][] B=new int[col_len][row_len];
        for(int i=0;ifor(int k=0;kreturn B;        
    }
}
python版

参考了网上思路,python转置用内置的zip()函数一行代码就解决
python有个强大numpy库有很强的数组处理能力,可以直接用A.T完成矩阵转置(A是矩阵)

class Solution(object):
    def transpose(self, A):   
        return [list(row) for row in zip(*A)]

2、数组拆分 #561

给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。

示例 1:
输入: [1,4,3,2]
输出: 4
解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).

思路:把数组由小到大排序之后,对下标为偶数的元素相加即可

python版
class Solution:
    def arrayPairSum(self, nums):
        nums.sort()
        lens =int(len(nums)/2)
        sums = 0
        for i in range(lens):
            sums+=nums[2*i]
        return sums

3、较大分组的位置 #830

在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。

例如,在字符串 S = “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的一些分组。

我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。

最终结果按照字典顺序输出。

示例 1:
输入: “abbxxxxzzy”
输出: [[3,6]]
解释: “xxxx” 是一个起始于 3 且终止于 6 的较大分组

示例 2:
输入: “abc”
输出: []
解释: “a”,”b” 和 “c” 均不是符合要求的较大分组。

思路:主要解决两个问题,如何统计相连元素相同的个数以及如何让下标在每次统计之后跳到随后的不相同元素位置
解决:用两个while循环计数,每次用k记下第一个统计的字符位置,i用于两个循环体中,每次遇到相隔字符相同的则进入第二层while循环中统计其个数,下标i递增。写这个算法是注意下标溢出

class Solution:
    def largeGroupPositions(self, S):
        L = []
        i = 0
        lens = len(S)-1
        while iwhile iand S[i]==S[i+1]:
                i = i+1
            if (i-k)>=2:
                L.append([k,i])
            i = i+1
        return L

你可能感兴趣的:(leetcode)