配列内の要素を左に回転させる問題を解決しようとしています。例:array = [1,2,3,4,5,6,7]
関数を呼び出す場合rotateToLeft(array[],int numberElements,int count)
ここで、array
は回転する配列、numberElements
は左に回転する要素の数、count
は配列のサイズです。私はO(n)の複雑さとO(1)時間のかかるアルゴリズムを探しています。私の最初の解決策は、二重にリンクされたリストを使用することですが、よりよい解決策があるかどうかを知りたいと思います。 LinkedListのの複雑なO(n)と時間O(1)の配列の左要素を回転する
クラスノード
@interface Node : NSObject
@property (nonatomic,assign) int element;
@property (nonatomic,strong) Node* next;
@property (nonatomic,strong) Node* previous;
@end
クラスは、LinkedListの
@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);
}
を管理する/////これは、AN、それは動作しますが、私はかどうかを知りたいの要素を回転させることが私の関数であります
-(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