找出数组int[] arr中第k小的奇数,arr[i]>0(i>=0),不使用全排序
一、单向链表实现
1、查找第k小奇数的方法
public int findKth(int[] arr, int k) {
if(arr==null||arr.length==0||k>arr.length) return 0;
LinkSort link = new LinkSort();
for(int i=0;i<arr.length;i++)
if(arr[i]%2!=0)
link.add(arr[i]);
if(link.size<k)return 0;
return link.get(k).value;
}
2、写一个带有排序功能的链表类(没加泛型)
public class LinkSort{
Node first;
int size=0;
public LinkSort() {
}
void add(int num) {
if(first==null)
first = new Node(num,1);
else
first.putNext(num);
this.size++;
}
Node get(int k){
return this.first.getNode(k);
}
public class Node{
int value;
int index;
Node next;
public Node() {
}
public Node (int num,int index) {
this.value = num;
this.index = index;
}
public void putNext(int num) {
int temp = this.value;
if(num < temp) {
this.value = num;
if(this.next==null)
this.next = new Node(temp,index+1);
else
this.next.putNext(temp);
}else {
if(this.next==null)
this.next = new Node(num,index+1);
else
this.next.putNext(num);
}
}
public Node getNode(int k) {
if(this.index==k)
return this;
else
return this.next.getNode(k);
}
}
}
3、关于时间复杂度
链表的时间复杂度是O(n),最外层还嵌套的for循环时间复杂度也是O(n),所以,本方法找到相应奇数值的时间复杂度为O(n^2)