下一个排列-中等
这题需要注意很多细节问题。
class Solution {
public void nextPermutation(int[] nums) {
int i=nums.length-1;//标注末尾索引
while(i>0){
if(nums[i]<=nums[i-1]){
i--;
}else{
int small=i-1;
for(int j=nums.length-1;j>=i;j--){
if(nums[j]>nums[small]){
int tmp=nums[small];
nums[small]=nums[j];
nums[j]=tmp;
break;
}
}
for(int k=i;k<(nums.length+i)/2;k++){
int tmp=nums[k];
nums[k]=nums[nums.length-1+i-k];
nums[nums.length-1+i-k]=tmp;
}
break;
}
}
if(i==0){
for(int j=0;j<(nums.length)/2;j++){
int tmp=nums[j];
nums[j]=nums[nums.length-1-j];
nums[nums.length-1-j]=tmp;
}
}
}
}
跳跃游戏-中等
刚开始用递归写,也能做出来但是超出了时间限制,后来又看了别人的代码,改了一下。
class Solution {
public boolean canJump(int[] nums) {
int k=0;//用来标识可以跳的最远的距离
for(int i=0;i<nums.length-1;i++){
if(k<i+nums[i]){
k=i+nums[i];
}
if(k==i&&nums[i]==0){
return false;
}
}
return k>=nums.length-1;
}
}
搜索旋转排序数组-中等
关键在于判断完所有的情况
class Solution {
public int search(int[] nums, int target) {
if(nums.length==1){
if(target==nums[0]){
return 0;
}else{
return -1;
}
}
int medium=nums.length/2;
int start=0;
int end=nums.length-1;
while(true){
if(nums[medium]==target){
return medium;
}
if(target==nums[start]){
return start;
}
if(target==nums[end]){
return end;
}
if(medium==start||medium==end){
return -1;
}
if(nums[start]<nums[end]){
if(target>nums[medium]){
start=medium;
medium=(start+end)/2;
}else{
end=medium;
medium=(start+end)/2;
}
}else if(target>nums[start]&&target>nums[medium]&&nums[start]<=nums[medium]){
start=medium;
medium=(start+end)/2;
}else if(target>nums[start]&&target>nums[medium]&&nums[start]>nums[medium]){
end=medium;
medium=(start+end)/2;
}else if(target>nums[start]&&target<nums[medium]){
end=medium;
medium=(start+end)/2;
}else if(target<nums[start]&&target>nums[end]){
return -1;
}else if(target<nums[start]&&target<nums[end]){
if(nums[medium]>=nums[start]||target>nums[medium]){
start=medium;
medium=(start+end)/2;
}else{
end=medium;
medium=(start+end)/2;
}
}
}
}
}