2022-3-2 剑指offer day20
题1:
JZ11 旋转数组的最小数字
描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)
1 import java.util.ArrayList; 2 public class Solution { 3 // public int minNumberInRotateArray(int [] array) { 4 // int ans=array[0]; 5 // int i=1; 6 // while (i<array.length&&array[i]>=array[i-1]) i++; 7 // return i>=array.length?ans:array[i]; 8 // } 9 10 11 public int minNumberInRotateArray(int [] array) { 12 int l=0,r=array.length-1; 13 while (l<=r) { 14 int mid=(l+r)/2; 15 if (array[mid]>array[r]){ 16 l=mid+1; 17 }else if (array[mid]<array[r]){ 18 r=mid; 19 }else r--; 20 } 21 return array[l]; 22 } 23 24 25 }
思路:二分或者直接遍历。
题2:
JZ38 字符串的排列
描述
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
数据范围:n < 10n<10
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)
输入描述:
输入一个字符串,长度不超过10,字符只包括大小写字母。
1 import java.util.*; 2 public class Solution { 3 ArrayList<String> ans; 4 Set<String> set; 5 public ArrayList<String> Permutation(String str) { 6 char[] arr=str.toCharArray(); 7 boolean[] visited=new boolean[arr.length]; 8 ans=new ArrayList<>(); 9 set=new HashSet<>(); 10 StringBuilder sb=new StringBuilder(); 11 dfs(0,arr,sb,visited); 12 return ans; 13 } 14 15 public void dfs(int n,char[] arr,StringBuilder sb,boolean[] v){ 16 if (n==arr.length) { 17 if (!set.contains(sb.toString())){ 18 ans.add(sb.toString()); 19 set.add(sb.toString()); 20 } 21 return; 22 } 23 for (int i=0;i<arr.length;i++) { 24 if (!v[i]) { 25 sb.append(arr[i]); 26 v[i]=true; 27 dfs(n+1,arr,sb,v); 28 sb.deleteCharAt(sb.length()-1); 29 v[i]=false; 30 } 31 } 32 } 33 34 }
思路:递归全排列,可能有重复字母,所以用set去重。