文章目录
剑指 Offer 61. 扑克牌中的顺子
- 思路:
- 本题就是想判断是否有序,因为是顺子,只需要大一个大小关系即可。(示例2:[0,0,1,2,5]这也是一个顺子)
- 将数组进行排序。可能会有大小王,设置一个标志,因为大小王是0,那么在遍历的时候,找到大小王的位置,从最后一个大小王的位置进行判断是否为顺子即可。
- 如果在遍历的过程中有重复的数,那么就不是顺子了。
- 最后判断数组最后一个数减去大小王之后的数差值是否在五以内(因为数值长度只有5)
- 代码:
class Solution {
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int boss = 0;
for(int i = 0; i < nums.length - 1; i++){
if(nums[i] == 0){
//大小王要跳过
boss++;
}else if(nums[i] == nums[i + 1]){
return false;
}
}
return nums[nums.length - 1] - nums[boss] < 5;
}
}
剑指 Offer 57 - II. 和为s的连续正数序列
-
思路:
参考题解
上图很好的说明了问题,给一个双指针,初始位置在第一个数字和第二个数字上,并设置一个初始和为3(因为1 + 2 = 3),判断元素和与目标值的关系,如果小了,那么就移动右边指针(先计算元素和,再进行指针),大了就移动左边指针(先移动指针,再机加上新元素值)。如果元素和正好和目标值一样,那么就创建一个数组,大小就是j - i + 1,并记录[i,j]
之间的值,添加完成之后添加到res里面。 -
代码:
class Solution {
public int[][] findContinuousSequence(int target) {
int i = 1, j = 2, s = 3;
List<int[]> res = new LinkedList<>();
while(i < j){
if(s == target){
int[] ans = new int[j - i + 1];
for(int k = i; k <= j; k++){
ans[k - i] = k;
}
res.add(ans);
}
if(s >= target){
s -= i;
i++;
}else {
j++;
s += j;
}
}
return res.toArray(new int[0][]);
}
}