思路:这题很简单,直接循环就行。但是评论区说这题被简化了,原题应该考虑大数情况,用字符串形式来解决。两种都列一下。
public int[] printNumbers(int n) {
int max = (int)Math.pow(10,n);
int[] result = new int[max-1];
for(int i=0;i<result.length;i++){
result[i] = i+1;
}
return result;
}
List<String> ans = new ArrayList<>();
public List<String> printNumbers(int n) {
StringBuilder sb = new StringBuilder();
// 位数
for (int i=0;i<=n;i++){
for (char j = '0';j<='9';j++){
sb.append(j);
dfs(i,1,sb);// 总位数;当前位数;sb
sb.deleteCharAt(sb.length()-1);
}
}
return ans;
}
private void dfs(int len,int idx,StringBuilder sb){
// 长度满足要求
if (idx == len){
ans.add(sb.toString());
return;
}
for (char j ='0';j<='9';j++){
sb.append(j);
dfs(len,idx+1,sb);
sb.deleteCharAt(sb.length()-1);
}
}
思路:刚开始用双重循环作比较,果不其然超时了。。。其实就是排序问题,计算交换了多少次。这里用归并排序解决
int count = 0;
public int reversePairs(int[] nums) {
this.count = 0;
mergeSort(nums,0,nums.length-1);
return count;
}
private void mergeSort(int[] nums,int low,int high){
if (low < high){
int mid = (low+high)/2;
mergeSort(nums,low,mid); // 左拆分
mergeSort(nums,mid+1,high); // 右拆分
merge(nums,low,mid,high);// 合并
}
}
private void merge(int[] nums,int low,int mid,int high){
int[] help = new int[high-low+1];
int left = low;
int right = mid+1;
int index = 0;
while (left<=mid && right<=high){
if (nums[left] <= nums[right]){
help[index++] = nums[left++];
}else{ // 此时满足逆序数条件
help[index++] = nums[right++];
count += mid-left+1;//存在的逆序数对数
}
}
while (left<=mid){
help[index++] = nums[left++];
}
while (right<=high){
help[index++] = nums[right++];
}
// 将新数组中的元素覆盖旧数组的元素
for (int i=0;i<help.length;i++){
nums[low+i] = help[i];
}
}