力扣hot100【Day2】

文章目录

  • 4.寻找两个正序数组的中位数
    • 解法
  • 5.最长回文字符串
    • 解法
  • 6.Z字形变换
    • 解法


4.寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。
力扣hot100【Day2】_第1张图片

解法

力扣hot100【Day2】_第2张图片

  • 当两个数组长度之和为偶数时,需要求中间两个数之和的平均值,当两个数组长度之和为奇数时,直接取中位数即可,循环截止到 length/2+1
  • 两个数组分别对应两个指针,指针 i 可以左移的条件是 i 不越界且( i 的值小于 j 对应的值或者 j 越界)
  • 定义两个变量 left 和 right 用来记录上一次循环时的值

5.最长回文字符串

给你一个字符串 s,找到 s 中最长的回文子串。
力扣hot100【Day2】_第3张图片

解法

力扣hot100【Day2】_第4张图片

  • 采用中心扩展法,由中间位置开始,往两侧位置扩展
  • 需要考虑两种字符串,aba 或者 abba,游标到达b时,有两种扩展方法
  • 定义start和end记录子串的起始位置和终止位置,最终String.substring的参数问题需要注意,包含start但不包含end

6.Z字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
力扣hot100【Day2】_第5张图片
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
力扣hot100【Day2】_第6张图片

解法

力扣hot100【Day2】_第7张图片

  • Z字形的排列是有规律的,因此先找出周期。r 行,第一列有r个元素,之后的 r - 1 列每列只有一个元素, r 列是一个周期,每个周期有 2 * r - 2 个元素,共有 n / (2 * r - 2 )向上取整个周期,每个周期有(r - 1)列,总体列数等于周期数乘以列数
  • n / t 向上取整可以用 (n + t - 1) / t 表示
  • 数组长度的获取直接 array.length; string类型长度的获取需要调用 s.length();
  • String类型获取第i个元素 s.charAt(i); String类型返回子串 s.substring()
  • 如果只有一个元素则直接返回该String类型
  • 因为需要对字符串进行修改,因此使用StringBuffer类
  • StringBuffer类添加元素 用 ans.append()
  • HashMap添加元素用map.put()
  • Set添加元素用set.add()

你可能感兴趣的:(leetcode,算法,c++)