
一、题意核心理解给定单词数组、每行最大长度maxWidth贪心尽可能多塞单词到一行然后补齐空格非最后一行、且多个单词两端对齐空格左边多、右边少、均匀分配只有一个单词 / 最后一行左对齐单词之间只有单个空格末尾补空格二、核心规则贪心尽可能往当前行塞单词每次能塞就塞塞不下就换行非末行、多单词空格尽可能均匀余数空格优先分给左边间隔单行只有一个单词单词左对齐后面全部补空格最后一行全部左对齐单词间只有 1 个空格末尾补满空格三、数学公式设wordCnt当前行单词数charLen所有单词纯字符长度总和不含空格totalSpace maxWidth - charLen本行需要填充的总空格数spaceCnt wordCnt - 1单词之间的间隔总数每个间隔基础空格base totalSpace / spaceCnt多出的余数空格extra totalSpace % spaceCnt前extra个间隔base 1 个空格后面所有间隔base 个空格四、整体算法流程遍历单词不断收集单词贪心凑满一行凑不下时处理当前行如果是最后一行→ 左对齐如果只有一个单词→ 左对齐否则 → 两端均匀对齐左多右少循环直到所有行处理完毕五、完整可直接提交 Java 代码javaimport java.util.ArrayList; import java.util.List; public class Solution { public ListString fullJustify(String[] words, int maxWidth) { ListString res new ArrayList(); int n words.length; int index 0; while (index n) { // 1. 贪心选出当前行最多能装的单词 [start, index-1] int start index; int len 0; // 纯单词字符总长度 while (index n len words[index].length() (index - start) maxWidth) { // (index-start) 是至少每个间隔1个空格的长度 len words[index].length(); index; } // 当前行单词数量 int wordCnt index - start; // 本行总空格数 int totalSpace maxWidth - len; StringBuilder sb new StringBuilder(); // 2. 判断是否为最后一行 || 只有一个单词 if (index n || wordCnt 1) { // 左对齐单词之间只隔1个空格 for (int i start; i index; i) { sb.append(words[i]); if (i ! index - 1) { sb.append( ); } } // 末尾补满空格 while (sb.length() maxWidth) { sb.append( ); } } // 3. 正常行两端对齐、均匀空格 else { int spaceGap wordCnt - 1; // 间隔数 int base totalSpace / spaceGap; // 基础空格 int extra totalSpace % spaceGap; // 左边多出来的空格 for (int i start; i index; i) { sb.append(words[i]); // 最后一个单词不加空格 if (i index - 1) break; // 前extra个间隔 多1个空格 int nowSpace base; if (extra 0) { nowSpace 1; extra--; } // 填充空格 for (int s 0; s nowSpace; s) { sb.append( ); } } } res.add(sb.toString()); } return res; } }六、逐场景拆解场景 1普通多行两端对齐空格均匀分配余数优先左边场景 2单行单个单词直接单词后面全部补空格场景 3最后一行强制左对齐间隔只有单个空格末尾补空格不平均分配七、高频易错点❌ 忘记最后一行特殊处理必须左对齐❌ 单行只有一个单词时错误平分空格❌ 多余空格分给右边正确左边优先多空格❌ 贪心判断条件写错必须包含「原有间隔 1 个空格」❌ 计算空格时把单词长度 空格长度算混八、极简背诵总结先贪心选一行所有单词最后一行 / 单个单词左对齐普通多行均分空格余数左加末尾统一补满 maxWidth