我想解決向左旋轉數組內部元素的問題。示例:array = [1,2,3,4,5,6,7]
如果我調用函數rotateToLeft(array[],int numberElements,int count)
其中:array
是要旋轉的數組,numberElements
是要向左旋轉的元素數量,count
是數組大小。我正在尋找O(n)複雜度和O(1)耗時的算法。我的第一個解決方案是使用雙向鏈表,但我想知道是否有更好的解決方案。在複雜度爲O(n)和時間O(1)的陣列中旋轉左元素
LinkedList的的等級節點
@interface Node : NSObject
@property (nonatomic,assign) int element;
@property (nonatomic,strong) Node* next;
@property (nonatomic,strong) Node* previous;
@end
類來管理鏈表
@interface LinkedList : NSObject
@property (nonatomic,strong) Node* tail;
@property (nonatomic,strong) Node* root;
-(void)addNode:(int)value;
-(void)printList;
-(void)rotateLeftElementsOnList:(LinkedList*)list elements:(int)numElement;
@end
@implementation LinkedList
-(instancetype)init{
self = [super init];
if (self) {
self.tail = nil;
}
return self;
}
-(void)addNode:(int)value{
Node* newNode = [[Node alloc] init];
newNode.element = value;
newNode.previous = nil;
newNode.next = nil;
if (self.tail == nil) {
newNode.next = nil;
newNode.previous = nil;
self.tail = newNode;
self.root = newNode;
return;
}
self.tail.previous = newNode;
newNode.next = self.tail;
self.tail = newNode;
}
-(void)printList{
Node* header = self.root;
while(header.previous != nil){
NSLog(@"%d",header.element);
header = header.previous;
}
NSLog(@"%d",header.element);
}
/////這是我的職責旋轉元素的它的工作原理,但我想知道有人知道更好的解決辦法,
-(void)rotateLeftElementsOnList:(LinkedList*)list elements:(int)numElement{
Node* header = self.root;
int index = 0;
while(index < numElement){
header = header.previous;
index++;
}
header.next.previous = nil;
header.next = nil;
self.root.next = self.tail;
self.tail.previous = self.root;
self.root = header;
}
你可能是指O(n)**時間**和O(1)**空間**。在O(1)時間移動正常數組中的所有元素是不可能的,「複雜性」可以指時間或空間。 – Dukeling
您是否可以在您的示例中包含函數的示例參數以及相應的輸出? – Dukeling