调整数组顺序使奇数位于偶数前面
题目描述
思路
双指针
代码实现
双指针
class Solution {
public static void main(String[] args) {
int [] nums={1,2,3,4};
exchange(nums);
}
public static int[] exchange(int[] nums) {
int i=0,j=nums.length-1;
while(i<j){
while(i<j&&(nums[i]&1)==1)i++;
while(i<j&&(nums[j]&1)==0)j--;
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
return nums;
}
}
复杂度分析
时间复杂度
O(N)
空间复杂度
O(1)
反思不足
思路
思路很模糊,结构化、可视化以及debug建议都用用
和为s的两个数字
题目描述
思路
双指针+二分查找
自己的思路,虽然不咋地但毕竟是自己想的
双指针+对撞指针
需要看到一个规律:
不等于目标值,要么小于要么大于,小于的情况下,要增大,于是可以移动左指针,反之同理
代码实现
双指针+二分查找
class Solution {
public int[] twoSum(int[] nums, int target) {
//确定边界
int l=0,r=nums.length-1,mid=l+(r-l)/2;;
//一个遍历,一个二分查找
while(l<=r){
if(nums[mid]>target)r=mid-1;
else l=mid+1;
mid=l+(r-l)/2;
}
int len=r;
int i=0;
for(i=0;i<len;i++){
l=i;
mid=l+(r-l)/2;
while(l<=r){
if(nums[mid]+nums[i]==target)break;
else if(nums[mid]+nums[i]<target)l=mid+1;
else r=mid-1;
mid=l+(r-l)/2;
}
if(l<=r)break;
}
int [] result={nums[i],nums[mid]};
return result;
}
}
双指针+对撞指针
class Solution {
public int[] twoSum(int[] nums, int target) {
int l=0,r=nums.length-1;
while(l<r){
int s=nums[l]+nums[r];
if(s<target)l++;
else if(s>target)r--;
else return new int[] {nums[l],nums[r]};
}
return new int[]{};
}
}
复杂度分析
时间复杂度
二分查找那个O(NlogN),对撞指针O(N)
空间复杂度
O(1)
反思不足
思路
看到有序数组能想到二分查找,是好的,比暴力好
不足之处在于没能看出数量关系,对对撞指针也没什么概念
java se
return new int[]{};
题目描述
思路
库函数法
分割,然后倒着拼接
双指针
用两个指针维护单词的边界,挨个去找
代码实现
库函数法
class Solution {
public String reverseWords(String s) {
String [] strs = s.split("[ ]+");
StringBuilder result=new StringBuilder();
for(int i=strs.length-1;i>=0;i--){
result.append(strs[i]+" ");
}
return result.toString().trim();
}
}
双指针法
class Solution {
public String reverseWords(String s) {
String s_=s.trim();
int i=s_.length()-1,j=i;
StringBuilder result=new StringBuilder();
while(i>=0){
while(i>=0&&s_.charAt(i)!=' ')i--;
result.append(s_.substring(i+1,j+1)+" ");
while(i>=0&&s_.charAt(i)==' ')i--;
j=i;
}
return result.toString().trim();
}
}
复杂度分析
时间复杂度
库函数法为O(N),所调用的api均不超过这个数量级
双指针亦为O(N)
空间复杂度
因为有个StingBuilder,所以均为O(N)