剑指Offer 57 和为s的连续正数序列
分析
- 使用滑动窗口
- 当当前值小于目标值,则右边界+1;当大于时,左边界+1;当等于时,将这些书存入数组,再令左边界+1,寻找下一组数据
class Solution{
public int[][] findContinuousSequence(int target) {
List<int[]> list = new ArrayList<>();
int left = 1;
int right = 1;
int sum = 0;
while(left <= target / 2) {
if(sum < target) {
sum += right;
right++;
}else if(sum > target) {
sum -= left;
left++;
}else {
int[] arr = new int[right - left];
for(int i = left; i < right; i++) {
arr[i - left] = i;
}
list.add(arr);
sum -= left;
left++;
}
}
return list.toArray(new int[0][]);
}
}
821.字符的最短距离
分析
- 使用两遍循环
- 分别从左到右和从右到左循环,循环都和上一个C字符出现的位置进行计算,再将两者进行比较,取较小的那一个
class Solution {
public int[] shortestToChar(String S, char C) {
int len = S.length();
int[] res = new int[len];
int temp = -10000;
for(int i = 0; i < len; i++) {
if(S.charAt(i) == C) {
temp = i;
}
res[i] = i - temp;
}
temp = 10000;
for(int i = len - 1; i >= 0; i--) {
if(S.charAt(i) == C) {
temp = i;
}
res[i] = Math.min(res[i], temp - i);
}
return res;
}
}